Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 用SetWinEventHook钩住窗户有时并不';行不通_Winapi_Hook - Fatal编程技术网

Winapi 用SetWinEventHook钩住窗户有时并不';行不通

Winapi 用SetWinEventHook钩住窗户有时并不';行不通,winapi,hook,Winapi,Hook,我编写了一些代码来监视窗口标题的更改。在我的Windows7中,它可以与不同的窗口配合使用。我使用SetWinEventHook如下: SetWinEventHook(EVENT_OBJECT_NAMECHANGE, EVENT_OBJECT_NAMECHANGE, 0, WinEventCallback, processId, thre

我编写了一些代码来监视窗口标题的更改。在我的Windows7中,它可以与不同的窗口配合使用。我使用SetWinEventHook如下:

SetWinEventHook(EVENT_OBJECT_NAMECHANGE,
                EVENT_OBJECT_NAMECHANGE,
                0,
                WinEventCallback,
                processId,
                threadId,
                WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS | WINEVENT_SKIPOWNTHREAD);
回拨:

void CALLBACK WinEventCallback(HWINEVENTHOOK hWinEventHook,
                           DWORD dwEvent,
                           HWND hwnd,
                           LONG idObject,
                           LONG idChild,
                           DWORD dwEventThread,
                           DWORD dwmsEventTime)
{
    qDebug("Window %p", hwnd);
    ...
    GetWindowText(hwnd, ...);
}
对于一个特定的窗口,我一直看到调试消息“window0x0”,例如,我在回调中将窗口句柄设置为零。在这种情况下,GetWindowText失败。所有其他窗口都可以正常工作。问题是为什么?我在Spy++中看不到任何特别之处:


并非所有生成的事件都与窗口关联,尤其是对于名称更改这样的通用事件。钩子特别声明空窗口是可能的,所以如果钩子逻辑是面向窗口的,就忽略它们。如果您看到一个窗口更改了其标题,但在回调中得到了一个空窗口,那么它可能不是一个真正的窗口,或者在将窗口封送到回调时出现了问题,或者类似的情况。

问题在于您使用的WinEventCallback的签名


使用以下方法修复它:WinEventCallback(IntPtr hWinEventHook、uint iEvent、IntPtr hWnd、int idObject、int idChild、uint dwEventThread、uint dwmsEventTime)

>这不是一个真正的窗口,我可以看到它是Spy++,这是带有标题、类等的常规WIn32窗口(请参见屏幕截图)。这对我来说很奇怪,我得到了空值。那个应用程序使用的是WinForms,它处理UI的方式与标准的Win32 UI非常不同。可能WinForms在调度事件时没有提供其HWND,或者钩子调度器根本不支持WinForms。其他工作窗口是否也使用WinForms?其他工作窗口是否也使用WinForms?是的,来自同一应用程序的其他窗口工作正常。对于该窗口,我看到消息WM_SETTEXT失败(在Spy++中右键单击->消息)。这意味着窗口忽略WM_SETTEXT,并以不同的方式设置窗口标题。可能窗口正在自定义绘制。