1. 程式人生 > >VC自動關閉彈出的MessageBox對話方塊的總結

VC自動關閉彈出的MessageBox對話方塊的總結

下面的程式從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);
}