我正在开发一个应用程序来检测弹出对话框,然后自动将其关闭。我将其编写为 C++/Win32 应用程序。该对话框是由 IE 7 生成的,我可以检测到该窗口,但是几种让“确定”按钮“单击”的方法都失败了。
搜索其他人的解决方案,将这些消息发送到按钮句柄似乎在很多情况下都有效:
PostMessage( handle, WM_LBUTTONDOWN, 0, 0 );
PostMessage( handle, WM_LBUTTONUP, 0, 0 );
PostMessage( handle, BM_SETSTATE, 1, 0 );
不过,它对我的测试中的按钮状态没有影响。
我可以将制表符发送到主窗口并看到 OK 按钮获得焦点,但随后发送返回字符什么也不做。
为了了解更多信息,我使用 Spy++ 来获取有关窗口层次结构的信息,以及当我手动单击“确定”按钮时传递了哪些消息。
查看消息日志并阅读有关 WM_MOUSEACTIVATE 的信息以提供解决方案。日志信息显示 0002166C 是按钮窗口。所以在我的代码中我尝试了这个:
GetClassNameA( handle, str, str_size );
if( strcmp( str, "Internet Explorer_Server" ) != 0 )
return TRUE; // Not the window we're interested in.
// Send a message to activate the button window and have it process a mouse click.
PostMessage( handle, WM_MOUSEACTIVATE, (WPARAM) dialog_handle, MAKELPARAM( HTCLIENT, WM_LBUTTONDOWN );
基于窗口层次结构和消息日志,我认为类名为“Internet Explorer_Server”的窗口是按钮。也许我错了,因为它看起来确实是一个奇怪的按钮类名......
下面是窗口层次结构图像的链接,当我手动单击“确定”按钮时的消息日志。最后是在 1 秒计时器票上执行的代码,用于查找窗口。
任何见解和帮助表示赞赏!
窗口层次结构、源、窗口消息和测试对话框源的图像可在此处获得:
https://sites.google.com/site/matthewmillersmiscellanea/Home/