自动关闭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
原创粉丝点击