自动关闭Assert窗口,Debug窗口
来源:互联网 发布:java中问号是什么意思 编辑:程序博客网 时间:2024/06/03 23:47
注:本文要解决的问题是,自动关闭海量的Assert窗口,或其他不想手动关闭的、大量的窗口。
============================================================================
在日常的工作中,为了调试的方便,往往在项目中引入大量的Assert,这些Assert的好处自不必说,但是有些Assert可能并不是程序的错误,而是数据的问题。
比如一个项目,在从数据库中读取数据时,如果数据不正确,会出现大量的Assert窗口,但也许这些错误并不是致命的,程序仍然可以正常运行,也不影响其他模块的Debug,这时我们就要手动一个个点“忽略”,或者按住键盘的 i 键不放,直到所有的Assert窗口全部关闭,这样做非常费时费力,影响开发效率。
所以就想着能否做个程序自动关闭这些烦人的窗口呢?
我的解决办法是:使用Spy++查到窗口的类名,然后在一个循环中FindWindow() 找到窗口,再给窗口的忽略按钮发送点击消息。每次循环完必须要Sleep一次,至于Sleep的时长,看个人需求,我是100ms一次。
void IgnoreAssert(){HWND hWnd = NULL;HWND hIgnore = NULL;while(true){//ASSERT DialoghWnd = ::FindWindow("#32770", "Microsoft Visual C++ Debug Library");if(!hWnd)hWnd = ::FindWindow("#32770", "Microsoft Visual C++ Runtime Library");if (hWnd){hIgnore = ::GetDlgItem(hWnd, 5/*忽略*/);if(hIgnore)::SendMessage(hIgnore, BM_CLICK, NULL, NULL);}//Client MessageBoxhWnd = ::FindWindow("#32770", "Error");if (hWnd){hIgnore = ::GetDlgItem(hWnd, 5/*忽略*/);if(hIgnore)::SendMessage(hIgnore, BM_CLICK, NULL, NULL);}::Sleep(100);}}
上面的#32770 是Windows Dialog的类名,通过Spy++取得,其实这个填NULL也可以找的到。
还有个问题,我是怎么找到”忽略“按钮的ID是5呢?
如下:
hWnd = ::FindWindow("#32770", "Test MessageBox");char szName[1024] = {0};for (int i= 0; i < 100; i++){::GetDlgItemText(hWnd, i, szName, 1024);int b = 0;}
在 int b = 0; 这一行下个断点,跑一下很快就能找到了。
最后我们可以写一个测试程序来试一下这个程序的功能:
int _tmain(int argc, _TCHAR* argv[]){while(true){_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);_ASSERT(0);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);Sleep(5000);}return 0;}
当然如果想做的更通用一点,可以写个配置文件,通过读取配置文件来支持关闭更多的窗口。
0 0
- 自动关闭Assert窗口,Debug窗口
- 自动关闭窗口
- 自动关闭窗口
- PHP自动关闭窗口
- JS自动关闭窗口
- 弹出窗口自动关闭
- 自动关闭 Alert 窗口
- JavaScript自动关闭窗口
- 窗口自动关闭
- JS自动关闭父窗口
- 如何自动关闭thickbox窗口
- 定时自动关闭弹出窗口
- 自动关闭窗口JS代码!
- 自动关闭窗口的JavaScript
- 倒计时自动关闭弹出窗口
- IE/Firefox 自动关闭窗口
- 倒计时自动关闭弹出窗口
- 关闭子窗口并自动刷新父窗口!
- 枚举类型的抽象方法定义实现
- android4.0 中如何在app 中拦截HOME键
- 2014西安网络赛1006||hdu5012 bfs
- ShowCursor
- 回调函数
- 自动关闭Assert窗口,Debug窗口
- HDU 5015 233 Matrix(西安网络赛I题)
- 使用windows自带工具管理开机启动项
- Linux常用命令
- MARK 学习网址
- 回顾 2013-2014
- Spring 4 + Hibernate 4的web程序中 获取Spring Context
- ptr = malloc(0*sizeof(char));
- 安卓下执行需要root权限的shell命令