4

我写了一些代码来观察窗口标题的变化。它适用于我的 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++ 中没有看到任何特别之处:

截屏

4

2 回答 2

2

并非所有生成的事件都可能与窗口相关联,尤其是对于像名称更改这样的通用事件。钩子文档特别指出可以使用 NULL 窗口,因此如果您的钩子逻辑是面向窗口的,则只需忽略它们即可。如果您看到一个窗口更改了它的标题,但在您的回调中得到一个 NULL 窗口,那么它不是真正的窗口,或者在将窗口编组到您的回调时出现问题,或者类似的事情。

于 2013-10-03T16:19:40.290 回答
0

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

使用这个修复它: WinEventCallback(IntPtr hWinEventHook, uint iEvent, IntPtr hWnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)

于 2014-04-16T18:27:56.007 回答