2013-10-03 57 views
4

我寫了一些代碼來觀察窗口標題的變化。它工作正常,在我的Windows 7不同的窗口我用SetWinEventHook這樣的:用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, ...); 
} 

對於一個特定的窗口,我看到調試信息「窗口中爲0x0」所有的時間,例如我在回調中將窗口句柄設置爲零。在這種情況下GetWindowText失敗。所有其他窗口都能正常工作問題是爲什麼?我沒有看到任何的間諜++非凡:

Screenshot

回答

2

未發生可能與窗口相關聯,尤其是對於一些作爲一般的名稱更改的所有事件。掛鉤documentation明確指出NULL窗口是可能的,所以如果你的鉤子邏輯是面向窗口的,就簡單地忽略它們。如果你看到一個窗口改變它的標題,但你在回調中獲得了一個NULL窗口,那麼它不是一個真正的窗口,或者將窗口封送到你的回調或類似的問題。

+0

>它不是一個真正的窗口 我可以看到它:

通過使用該一個修復它Spy ++,這是帶標題,類等的常規WIn32窗口(參見截圖)。這對我來說很奇怪,我得到NULL。 – DmitryARN

+1

該應用程序使用WinForms,它處理UI的方式與標準的Win32 UI非常不同。也許WinForms在調度事件時不提供HWND,或者鉤子調度程序根本不支持WinForms。其他工作窗口是否也使用WinForms? –

+0

_Do其他工作窗口也使用WinForms?_ 是的,來自同一應用程序的其他窗口工作正常。對於那個窗口,我看到消息WM_SETTEXT失敗(在Spy ++中右擊 - >消息)。這意味着該窗口忽略WM_SETTEXT並以不同的方式設置窗口標題SOMEHOW。 – DmitryARN

-1

問題出在您使用的WinEventCallback簽名。 WinEventCallback(IntPtr的hWinEventHook,UINT iEvent,IntPtr的的HWND,INT idObject,INT idChild,UINT dwEventThread,UINT dwmsEventTime)