我很难让一个全球系统挂钩起作用。当窗口移动时,我希望尽早收到通知,并更改窗口大小。这意味着CBT钩子HCBT_MOVESIZE不会切断它,它只会在窗口被移动之后发生。我想钩住窗口的实际移动,并能够在移动期间更改窗口大小。
钩子是从DLL中设置的,回调函数在该DLL中。这就是我试过的。
WH_CALLWNDPROC.当窗口被移动时,它确实会提醒我(从其他应用程序接收到窗口的message.WH_CALLWNDPROCRET ),但是我不能更改WH_CALLWNDPROC.HCBT_MOVESIZE的内容。事件发生在late.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在每个程序运行后崩溃(许多其他窗口也是如此)。如果我放置断点并遍历"unsubclassing",它会运行得很好,但是当我让程序自己运行时就不行了。想法?
我有一个CBT钩子(以前就有),每当HCBT_ACTIVATE被发送到一个新窗口时,我就使用SetWindowLongPtr()删除以前的子类(这也必须在64位上运行),然后子类化新窗口。如果我在任何地方放置一个断点,并在会话中断时立即恢复,则一切正常。但是,当我没有任何断点时,Visual会在程序退出时崩溃。
发布于 2009-08-25 16:31:47
钩子很重。你只想在你绝对需要的时候使用它们。
也就是说,您可以简单地使用其中一个基本钩子作为进入该过程的方法。在这个过程中,您可以对您感兴趣的窗口进行子类化,并处理子类proc中的大小大小消息,而不是试图在钩子级别捕获所有内容。
根据您想要做什么来响应调整的大小,您可能需要一些进程间的通信。
https://stackoverflow.com/questions/1327691
复制相似问题