【问题标题】:Detect what window was active just before my app activates在我的应用程序激活之前检测哪个窗口处于活动状态
【发布时间】:2011-06-15 15:00:08
【问题描述】:

在 Delphi XE 中,我正在尝试使用 GetForegroundWindow 来检测在我的应用程序被激活之前处于活动状态的窗口。 “已激活”表示该应用可能已从图标状态恢复,或已通过 alt+tab 切换到,或通过激活热键等方式调出。

问题是所有可用的应用程序事件(OnActivate、OnRestore)都来得太晚了,所以 GetForegroundWindow 返回我自己的表单句柄。主窗体的事件就更没用了。在主窗体中处理 WM_ACTIVATEAPP 也太晚了。

一种方法是在我的应用程序不活动时继续检查计时器上的活动窗口,但这似乎相当浪费。更好的解决方案是将 TApplication.WndProc 子类化并在处理 WM_ACTIVATEAPP 之前做我的事情,但我认为 TApplication 不能被子类化。

有没有更好的办法?

【问题讨论】:

  • 您可以通过调用Application.HookMainWindow 处理TApplication.WndProc 收到的任何消息。在TApplication 进行任何自己的处理之前,会调用挂钩程序。不过,我不知道wm_ActivateApp 是否会可靠地告诉你想要你认为你需要知道的信息。

标签: windows delphi foreground


【解决方案1】:

当您的应用程序激活时,它会成为最顶层的窗口。 IOW,它会跳到 Z 顺序的顶部位置。

这样,前一个最上面的窗口被降级到“就在新的最上面的窗口下面”的位置。 IOW,它在 Z-order 位置成为第二个。

调用GetNextWindow 并将您的表单句柄传递给它,GW_HWNDNEXT 可能会为您提供所需的结果。

【讨论】:

    【解决方案2】:

    所有窗口都有一个 z 顺序,这是窗口用来确定应该在哪个窗口上绘制的数字。

    当您激活一个程序时,您的应用程序将放在 z-list 的顶部。

    当您按下 alt-tab 时,Windows 会循环浏览该列表。所以按住 alt-tab 并按住它,看看东西是如何排序的。

    查看这个以了解如何模拟 alt-tab: http://www.swissdelphicenter.ch/torry/showcode.php?id=2103

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 2021-09-13
      相关资源
      最近更新 更多