首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >全局拦截窗口运动

全局拦截窗口运动
EN

Stack Overflow用户
提问于 2009-08-25 11:32:55
回答 1查看 2.7K关注 0票数 6

我很难让一个全球系统挂钩起作用。当窗口移动时,我希望尽早收到通知,并更改窗口大小。这意味着CBT钩子HCBT_MOVESIZE不会切断它,它只会在窗口被移动之后发生。我想钩住窗口的实际移动,并能够在移动期间更改窗口大小。

钩子是从DLL中设置的,回调函数在该DLL中。这就是我试过的。

  • WH_CALLWNDPROC.当窗口被移动时,它确实会提醒我(从其他应用程序接收到窗口的message.
  • WH_CALLWNDPROCRET ),但是我不能更改WH_CALLWNDPROC.
  • CBT钩子HCBT_MOVESIZE的内容。事件发生在late.
  • WH_GETMESSAGE.上永远不要收到WM_MOVEWM_MOVINGWM_WINDOWPOSCHANGING。这个钩子将允许我更改消息。

更新:Windows事件钩子似乎允许我捕获它:

代码语言:javascript
复制
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会在程序退出时崩溃。

EN

回答 1

Stack Overflow用户

发布于 2009-08-25 16:31:47

钩子很重。你只想在你绝对需要的时候使用它们。

也就是说,您可以简单地使用其中一个基本钩子作为进入该过程的方法。在这个过程中,您可以对您感兴趣的窗口进行子类化,并处理子类proc中的大小大小消息,而不是试图在钩子级别捕获所有内容。

根据您想要做什么来响应调整的大小,您可能需要一些进程间的通信。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1327691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档