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

简介: 标签: messagebox vc it 分类: VC/MFCvoid CTestDlg::OnOK(){ // TODO: 在此添加控件通知处理程序代码 SetTimer(NULL,2000,NULL);          //设置一个...

标签: 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. }  


目录
相关文章
对话框完全显示后,马上执行一个按钮的事件
对话框完全显示后,马上执行一个按钮的事件
|
Windows
教你彻底关闭win10的自动更新
最近的windows10更新是越来越可怕了。不仅常驻后台偷吃资源和网络,还不让关闭。
3188 0
教你彻底关闭win10的自动更新
|
C# Windows
C# 程序关闭托盘图标不会自动消失
原文:C# 程序关闭托盘图标不会自动消失 c#程序关闭托盘图标不会自动消失,进程的托盘图标却不能随着进程的结束而自动消失  必须将鼠标移到图标上面时才能消失?  请问如何才能做到图标随着进程的结束而自动消失呢(外部强行结束,如在任务管理器将其结束), windows系统好多程序都会这样。
1208 0
|
Windows
Win10如何关闭自动更新服务
原文:Win10如何关闭自动更新服务 第一步: 小娜搜索“gpedit.msc”,进入本地计算机策略设置。 第二步: 找到策略位置:本地计算机策略-计算机配置-管理模板-Windows 组件-Windows 更新-配置自动更新 第三步: 双击打开“配置自动更新”,设置为“已禁用”状态,确定退出即可。
932 0