我想在打开特定对话框时进行一些处理,但是当打开该对话框时,我无法找到任何获取通知的方法。
有没有办法在应用程序中获取打开特定窗口对话框的通知?
有关该对话框的唯一可用信息是其标题及其唯一。
答案 0 :(得分:2)
一般的解决方案是使用Windows钩子,过滤到WH_CBT,过滤到WM_CREATE或类似的东西,获取窗口文本,看看它是否是你感兴趣的。
另一个重要的一点:在钩子中你应该使用SetWindowLongPtr()将窗口进程设置为你自己的函数,它将实际接收WM_CREATE事件。在所有调用中,此函数应调用原始窗口过程。
答案 1 :(得分:1)
您还可以使用CBT Hook来观看窗口创建消息。您将可以访问用于创建实际窗口的CREATSTRUCT,例如标题和类名。您可以阻止在钩子中创建窗口,修改大小等。
答案 2 :(得分:0)
编辑:抱歉没有注意到您自己没有代码,只有标题。所以我认为其他帖子解决方案就是你所需要的
win32应用程序中的事件处理是通过所谓的windows过程完成的,这是一个具有以下签名的回调函数:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
每次有一条用于向此回调函数注册的窗口的消息时,Windows都会调用此回调。发送到新窗口的第一个消息之一是WM_CREATE消息。
如果您使用win32 API“手动”创建窗口,那么应该有一个静态回调函数,如下所示,您可以在其中过滤WM_CREATE消息。
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch( message )
{
case WM_CREATE:
// do what ever you want
return 0;
case default:
return DefWndProc( hwnd, message, wParam, lParam );
}
}
如果使用MFC对话框(CDialog),则可以覆盖函数CDialog::OnInitDialog()
。
答案 3 :(得分:0)
好的,这样做的方法是使用SetWindowsHookEx(WH_SYSMSGFILTER,...) 你将获得比你真正需要的更多回调。和全局钩子是系统性能的真正消耗(它们可以强制系统序列化通常独立运行的东西)
请务必阅读备注,尤其是这一部分:
SetWindowsHookEx可用于将DLL注入另一个进程。 32位DLL无法注入64位进程,64位DLL无法注入32位进程。如果应用程序需要在其他进程中使用钩子,则需要32位应用程序调用SetWindowsHookEx将32位DLL注入32位进程,并且64位应用程序调用SetWindowsHookEx注入64位DLL进入64位进程。 32位和64位DLL必须具有不同的名称。
你的钩子必须存在于一个dll中,并且dll最终会被加载到其他进程的地址空间中,因此你不会访问你的进程的地址空间,你将不得不设置某种类型的钩子和应用程序之间的进程间通信。
总的来说,我觉得这听起来真的很糟糕。