【发布时间】:2009-08-25 11:32:55
【问题描述】:
我无法让全局系统挂钩工作。我希望在窗口移动时尽早收到通知,并更改窗口大小。这意味着 CBT 钩子HCBT_MOVESIZE 不会剪切它,它只会在窗口移动后发生。我想钩住窗口的实际移动,并且能够在移动过程中改变窗口大小。
挂钩是从 DLL 设置的,回调函数位于该 DLL 中。这是我尝试过的。
-
WH_CALLWNDPROC。它会在窗口移动时提醒我(从其他应用程序接收到窗口的WM_MOVING),但我无法更改消息的内容。 -
WH_CALLWNDPROCRET同WH_CALLWNDPROC。 - 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);
但是,这会产生一个不同的问题:即使我使用SWP_NOSENDCHANGING,使用SetWindowPos() 更改窗口大小也不起作用(它可以更改大小,但会立即更改回原来的大小)。想法?
更新 2:子类化似乎可以工作,但是 Visual Studio 在每个程序运行后都会崩溃(许多其他窗口也是如此)。如果我放置断点并遍历“取消子类化”,它会很好地工作,但当我让程序自行运行时则不行。想法?
我有一个 CBT 钩子(它从早些时候就在那里),每当为新窗口发送 HCBT_ACTIVATE 时,我使用 SetWindowLongPtr() 删除任何以前的子类(这也必须在 64 位上运行),然后子类化新窗口。如果我在任何地方放置一个断点,并在它中断时立即恢复会话,那么一切正常。但是,当我没有任何断点时,Visual Studio 会在程序退出时崩溃。
【问题讨论】: