VC自動關閉彈出的MessageBox對話方塊的總結
阿新 • • 發佈:2019-01-02
下面的程式從5種方法,關閉彈出的MessageBox對話方塊:
首先,建立定時器和彈出MessageBox:
void CTestDlg::OnBnClickedButton1() { //啟動一個定時器,用於自動觸發關閉MessageBox對話方塊 SetTimer(1, 1000, NULL); //啟動一個MessageBox對話方塊,並檢查它的返回值 int ret = MessageBox("Hello", "MyMessageBox", MB_YESNO); if (ret == IDYES) { TRACE("按鈕【YES】被按下\n"); } else if(ret == IDNO) { TRACE("按鈕【NO】被按下\n"); } }
然後,在定時器回撥中:
void CTestDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 if (nIDEvent == 1) { HANDLE hWnd = ::FindWindowEx(NULL, NULL, NULL, "MyMessageBox"); //HANDLE hWnd = ::GetForegroundWindow(); if (hWnd) { TRACE("發現了MyMessageBox視窗\n"); // // 第一種方法:直接傳送 WM_CLOSE 訊息。 // ::SendMessage((HWND)hWnd, WM_CLOSE, NULL, NULL); // // 第二種方法: // ::EndDialog((HWND)hWnd, IDNO); // // 第三種方法:模擬視窗訊息點選了【IDNO】按鈕 // HWND h = ::GetDlgItem((HWND)hWnd, IDNO); if(h) { TRACE("找到了IDNO控制元件視窗\n"); ::PostMessage((HWND)hWnd, WM_COMMAND, MAKEWPARAM(IDNO, BN_CLICKED), (LPARAM)h); } // // 第四種方法:模擬滑鼠移到了【IDNO】按鈕上點選 // HWND h = ::GetDlgItem((HWND)hWnd, IDNO); if(h) { TRACE("找到了IDNO控制元件視窗\n"); POINT pt; CRect rc; ::GetWindowRect(h, &rc); pt.x = rc.left+10; pt.y = rc.top+10; SetCursorPos(pt.x, pt.y);//滑鼠移到了【IDNO】按鈕上 //完成點選 mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP|MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0); } // // 第五種方法:模擬鍵盤迴車關閉對話方塊 // keybd_event(VK_RETURN, 0, 0,0); keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP,0); } } CDialog::OnTimer(nIDEvent); }