Winapi 用SetWinEventHook钩住窗户有时并不';行不通
我编写了一些代码来监视窗口标题的更改。在我的Windows7中,它可以与不同的窗口配合使用。我使用SetWinEventHook如下:Winapi 用SetWinEventHook钩住窗户有时并不';行不通,winapi,hook,Winapi,Hook,我编写了一些代码来监视窗口标题的更改。在我的Windows7中,它可以与不同的窗口配合使用。我使用SetWinEventHook如下: SetWinEventHook(EVENT_OBJECT_NAMECHANGE, EVENT_OBJECT_NAMECHANGE, 0, WinEventCallback, processId, thre
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,并以不同的方式设置窗口标题。可能窗口正在自定义绘制。