我無法讓全局系統鉤子工作。我希望在窗口移動時儘早得到通知,並更改窗口大小。這意味着CBT鉤子HCBT_MOVESIZE
不會剪切它,它只發生在窗口移動後。我想勾住窗口的實際移動,並能夠在移動過程中更改窗口大小。全局攔截窗口運動
掛鉤是從DLL中設置的,並且回調函數在該DLL內。這是我試過的。
WH_CALLWNDPROC
。它在移動窗口時收到警告(從其他應用程序的窗口收到WM_MOVING
),但我無法更改消息的內容。與相同。- CBT掛鉤
HCBT_MOVESIZE
。事件發生的很晚。 WH_GETMESSAGE
。永遠不要收到WM_MOVE
,WM_MOVING
或WM_WINDOWPOSCHANGING
。這個鉤子可以讓我改變消息。
更新:Windows事件掛鉤似乎讓我捕捉到它:
hWinEventHook = SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART,
EVENT_SYSTEM_MOVESIZEEND, NULL, WinEventProc,
0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
然而,這創造了一個不同的問題:改變使用SetWindowPos()
不起作用窗口的大小(它改變尺寸沒問題,但立即變回原來的尺寸),即使我使用SWP_NOSENDCHANGING
。想法?
更新2:子類化似乎工作,但是每個程序運行後Visual Studio崩潰(所以許多其他窗口)。如果我放置斷點並遍歷「unsubclassing」,而不是當我讓程序自行運行時,它會很好。想法?我有一個CBT鉤子(它早就在那裏),並且每當HCBT_ACTIVATE
被髮送到一個新窗口時,我使用SetWindowLongPtr()
(它也必須在64位上運行)刪除任何以前的子類,然後子類新窗口。如果我在任何地方放置斷點,並在斷開時立即恢復會話,則一切正常。但是,當我沒有任何斷點時,Visual Studio會在程序退出時崩潰。
HCBT_MOVESIZE會發生什麼情況:用戶可以開始拖動窗口,繼續拖動窗口,並且在窗口放開之前通知不會到達。儘管如此,在窗口被技術性移動之前,你會收到通知,但它仍然非常沒用。 – 2009-08-25 12:07:12