VC 定时自动关闭MessageBox弹出对话框 (2010-12-15 15:28:06)转载▼


标签: messagebox vc it 分类: VC/MFC
void CTestDlg::OnOK()
{
 // TODO: 在此添加控件通知处理程序代码
 SetTimer(NULL,2000,NULL);          //设置一个定时器,2秒后触发
 MessageBox(_T("aaaaa"),_T("B"),MB_YESNO);   //跳出一个标题为B的窗口
 
}
void CTestDlg::OnTimer(UINT_PTR nIDEvent)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 HWND hWnd=::FindWindow(NULL,_T("B"));   //查找标题为B的窗口,返回窗口句柄
 if (hWnd)   //如果窗口句柄存在
 {
  //::SendMessage(hWnd,WM_SYSCOMMAND,SC_CLOSE,NULL);   //关闭这个窗口,如果Messagebox的对话框没有MB_YESNO或者MB_OKCANCEL这样类似的属性,这个也可以实现关闭
  keybd_event(13,0,0,0); //模拟回车键按下
 }
 KillTimer(nIDEvent);   //关闭定时器
 
 CDialog::OnTimer(nIDEvent);

}



第二套方案




下面的程序从5种方法,关闭弹出的MessageBox对话框:

首先,创建定时器和弹出MessageBox:

[cpp] view plain copy
  1. void CTestDlg::OnBnClickedButton1()  
  2. {  
  3.     //启动一个定时器,用于自动触发关闭MessageBox对话框  
  4.     SetTimer(1, 1000, NULL);  
  5.   
  6.     //启动一个MessageBox对话框,并检查它的返回值  
  7.     int ret = MessageBox("Hello""MyMessageBox", MB_YESNO);  
  8.     if (ret == IDYES)  
  9.     {  
  10.         TRACE("按钮【YES】被按下\n");  
  11.     }  
  12.     else if(ret == IDNO)  
  13.     {  
  14.         TRACE("按钮【NO】被按下\n");  
  15.     }  
  16. }  

然后,在定时器回调中:

[cpp] view plain copy
  1. void CTestDlg::OnTimer(UINT_PTR nIDEvent)  
  2. {  
  3.     // TODO: 在此添加消息处理程序代码和/或调用默认值  
  4.     if (nIDEvent == 1)  
  5.     {  
  6.         HANDLE hWnd = ::FindWindowEx(NULL, NULL, NULL, "MyMessageBox");  
  7.         //HANDLE hWnd = ::GetForegroundWindow();  
  8.         if (hWnd)  
  9.         {  
  10.             TRACE("发现了MyMessageBox窗口\n");  
  11.   
  12.   
  13.             //  
  14.             // 第一种方法:直接发送 WM_CLOSE 消息。  
  15.             //  
  16.             ::SendMessage((HWND)hWnd, WM_CLOSE, NULL, NULL);  
  17.   
  18.   
  19.             //  
  20.             // 第二种方法:  
  21.             //  
  22.             ::EndDialog((HWND)hWnd, IDNO);  
  23.   
  24.   
  25.             //  
  26.             // 第三种方法:模拟窗口消息点击了【IDNO】按钮  
  27.             //  
  28.             HWND h = ::GetDlgItem((HWND)hWnd, IDNO);  
  29.             if(h)  
  30.             {  
  31.                 TRACE("找到了IDNO控件窗口\n");  
  32.                 ::PostMessage((HWND)hWnd, WM_COMMAND, MAKEWPARAM(IDNO, BN_CLICKED), (LPARAM)h);  
  33.             }  
  34.   
  35.   
  36.             //  
  37.             // 第四种方法:模拟鼠标移到了【IDNO】按钮上点击  
  38.             //  
  39.             HWND h = ::GetDlgItem((HWND)hWnd, IDNO);  
  40.             if(h)  
  41.             {  
  42.                 TRACE("找到了IDNO控件窗口\n");  
  43.                 POINT pt;  
  44.                 CRect rc;  
  45.                 ::GetWindowRect(h, &rc);  
  46.                 pt.x = rc.left+10;  
  47.                 pt.y = rc.top+10;  
  48.                 SetCursorPos(pt.x, pt.y);//鼠标移到了【IDNO】按钮上  
  49.   
  50.                 //完成点击  
  51.                 mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0);  
  52.                 mouse_event(MOUSEEVENTF_LEFTUP|MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0);  
  53.             }  
  54.   
  55.             //  
  56.             // 第五种方法:模拟键盘回车关闭对话框  
  57.             //  
  58.             keybd_event(VK_RETURN, 0, 0,0);  
  59.             keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP,0);  
  60.   
  61.         }  
  62.   
  63.     }  
  64.   
  65.     CDialog::OnTimer(nIDEvent);  
  66. }  


上一篇:Mobileye闯红灯之后,这些问题值得我们深思


下一篇:MFC对话框屏蔽Enter和ESC键