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);
}


你可能感兴趣的:(VC自动关闭弹出的MessageBox对话框的总结)