使用SetWinEventHook挂钩窗口有时不起作用

时间:2013-10-03 14:56:16

标签: winapi hook

我写了一些代码来监视窗口标题的变化。它适用于Windows 7中的不同窗口。我使用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, ...);
}

对于一个特定的窗口,我一直看到调试消息“Window 0x0”,例如我在回调中将窗口句柄设置为零。在这种情况下,GetWindowText失败。所有其他窗口工作正常。问题是为什么?在Spy ++中我没有看到任何特别的东西:

Screenshot

2 个答案:

答案 0 :(得分:2)

并非所有生成的事件都可能与窗口相关联,尤其是对于名称更改通用的内容。钩子documentation明确指出NULL窗口是可能的,所以如果你的钩子逻辑是面向窗口的,那么就简单地忽略它们。如果你看到一个窗口改变它的标题,但你在回调中得到一个NULL窗口,那么要么它不是一个真正的窗口,要么将窗口编组到你的回调中,或类似的东西。

答案 1 :(得分:-1)

问题出在你正在使用的WinEventCallback签名上。

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