【问题标题】:How to detect that my app is the top-most window如何检测我的应用程序是最顶层的窗口
【发布时间】:2015-07-07 16:58:02
【问题描述】:

“休眠”应用程序可以通过七种方式变为“活动”应用程序,具体取决于它是最小化还是简单地隐藏,以及是否通过 alt-tab、鼠标重新激活 -单击它的图标,通过从另一个程序发送 Windows 消息重新激活它,或者当隐藏它的应用程序关闭(或最小化)时被简单地“发现”为桌面上最顶层的应用程序。

在所有情况下,我都需要知道我的应用程序现在是活动的(例如桌面上最顶部的)应用程序,以便我可以从数据库中刷新它的数据。

我确实知道应用程序“知道”它们何时位于最顶部,因为我可以看到边框在它们成为最顶部时立即变为活动颜色。

如果我捕获 WM_ACTIVATE_APP 消息,这在大多数情况下都有效,但在我的应用最小化并恢复到活动状态时似乎不起作用。

在用户执行任何操作之前,我需要被告知我的应用现在处于最顶层且处于活动状态。

有什么建议吗?谢谢,戴夫

【问题讨论】:

  • 如果一个非活动的应用程序被简单地发现并且没有因此变得活动,它的边界不会改变。我想您正在询问如何特别检测这种情况(因为如果应用程序确实变得活跃,您将获得 WM_ACTIVATE_APP)。我认为这与应用程序是否是最顶级的无关。也许您应该更新您的问题以澄清这一点。

标签: windows winforms


【解决方案1】:

尝试以下方法:

经过一段时间后,数据库中的数据应被视为过期,在您的窗口(或 WinForms 等效项)上调用 InvalidateRect()。如果您的窗口没有被遮挡,它将立即获得 WM_PAINT。但是如果窗口完全被遮挡,它不应该得到 WM_PAINT,直到操作系统真正需要显示它 - 即当遮挡窗口被移动时。刷新数据库中的数据以响应 WM_PAINT 消息。

原来是Raymond Chen blogged about this back in 2003

【讨论】:

  • 不幸的是,这种方法行不通。数据过期的时间量变化很大,并且取决于其他应用程序中发生的活动。因此,在我的应用中执行刷新的唯一合理时间是用户“回到”我的应用时。
【解决方案2】:

经过调查,我找到了问题的原因和解决方案。

我发现WM_ACTIVATEAPP 消息正在发送(和接收)正常,但这发生在应用仍处于最小化状态时(即在恢复之前)。

因为我有一个if 测试,当应用程序被最小化时不做任何事情(这是毫无意义的,因为用户不会看到结果!),所以没有采取任何行动。

WM_ACTIVATEAPP 消息在应用“被发现”时发送,这没关系,因为应用没有最小化。

我现在也回复WM_WINDOWPOSCHANGED,它在恢复时被触发, 而且这种组合似乎涵盖了重新激活我的应用的所有七种方式。

【讨论】:

  • 不更新问题的问题在于,遇到相同问题的其他人很难理解解决方案可能就在这里。所以请编辑问题。不要忘记接受对您有帮助的答案(即使是您自己的)。然后,我将删除我所做的不再相关的任何 cmets/answers。 (我仍然不清楚您是真的想要在数据变得可见时刷新数据,还是在应用程序获得焦点时刷新数据。这是两件不同的事情。)
猜你喜欢
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
相关资源
最近更新 更多