我写了一些代码来监视窗口标题的变化。它适用于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 ++中我没有看到任何特别的东西:
答案 0 :(得分:2)
并非所有生成的事件都可能与窗口相关联,尤其是对于名称更改通用的内容。钩子documentation明确指出NULL窗口是可能的,所以如果你的钩子逻辑是面向窗口的,那么就简单地忽略它们。如果你看到一个窗口改变它的标题,但你在回调中得到一个NULL窗口,那么要么它不是一个真正的窗口,要么将窗口编组到你的回调中,或类似的东西。
答案 1 :(得分:-1)
问题出在你正在使用的WinEventCallback签名上。
使用以下方法修复它:WinEventCallback(IntPtr hWinEventHook,uint iEvent,IntPtr hWnd,int idObject,int idChild,uint dwEventThread,uint dwmsEventTime)