【问题标题】:Globally intercept window movement全局拦截窗口移动
【发布时间】:2009-08-25 11:32:55
【问题描述】:

我无法让全局系统挂钩工作。我希望在窗口移动时尽早收到通知,并更改窗口大小。这意味着 CBT 钩子HCBT_MOVESIZE 不会剪切它,它只会在窗口移动后发生。我想钩住窗口的实际移动,并且能够在移动过程中改变窗口大小。

挂钩是从 DLL 设置的,回调函数位于该 DLL 中。这是我尝试过的。

  • WH_CALLWNDPROC。它会在窗口移动时提醒我(从其他应用程序接收到窗口的WM_MOVING),但我无法更改消息的内容。
  • WH_CALLWNDPROCRETWH_CALLWNDPROC
  • CBT 钩子HCBT_MOVESIZE。活动迟到了。
  • WH_GETMESSAGE。永远不要收到WM_MOVEWM_MOVINGWM_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 会在程序退出时崩溃。

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    嗯,我会认为 HCBT_MOVESIZE 正是您想要的,因为 MSDN 是这么说的 CBT 挂钩:

    系统在激活、创建、销毁之前调用该函数,
    最小化、最大化、移动或调整窗口大小。

    特别是:

    HCBT_MOVESIZE
        一个窗口即将被移动或调整大小。

    (这些引用来自http://msdn.microsoft.com/en-us/library/ms644977%28VS.85%29.aspx

    ...所以我本以为您会及时收到 HCBT_MOVESIZE 调用。处理 HCBT_MOVESIZE 的钩子函数也允许返回一个整数,以便系统可以确定是否允许或应该阻止该操作。因此,鉴于 HCBT_MOVESIZE 钩子应该有一个选项来阻止该操作,我会说它是在移动事件发生之前调用的。

    你确定钩子函数是在 移动事件之后调用的吗?如果您在钩子函数中对特定句柄进行 GetWindowRect 调用,返回的矩形是否等于传递给钩子函数的矩形?

    【讨论】:

    • HCBT_MOVESIZE 发生的情况是用户可以开始拖动窗口,继续拖动它,在他放开窗口之前通知没有到达。尽管如此,您还是会在窗口被技术性移动之前收到通知,但这仍然毫无用处。
    【解决方案2】:

    钩子很重。您只想在绝对必要时使用它们。

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

    根据您想要针对调整大小执行的操作,您可能需要一些进程间通信。

    【讨论】:

    • 子类化似乎是这里的方法。但是,当我没有逐步删除子类时,Visual Studio 总是崩溃。
    猜你喜欢
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多