【问题标题】:How to keep window always on top如何保持窗口始终在顶部
【发布时间】:2011-12-11 08:01:28
【问题描述】:

即使有另一个应用程序的窗口激活了Topmost = true 选项并试图停留在我的窗口前面,我如何才能让我的窗口始终保持在顶部?

【问题讨论】:

  • 我相信通过 WinAPI 可以做到这一点:有“一些”赢家,但考虑一下像 DeskPins 这样的应用程序,它几乎可以胜任任何事情。 (而且我很确定它不涉及事件。)
  • 运行 osk.exe 并尝试在上面放一些东西。

标签: c# window


【解决方案1】:

您可以在 BringWindowToTop 上执行平台调用来实现此目的:

[DllImport("user32.dll", SetLastError=true)]
static extern bool BringWindowToTop(IntPtr hWnd);

[DllImport("user32.dll", SetLastError=true)]
static extern bool BringWindowToTop(HandleRef hWnd);

FocusLost 事件触发时调用它。

【讨论】:

    【解决方案2】:

    应该可以通过在 OnFocusLost 事件处理程序中设置焦点窗口来实现。

    【讨论】:

      【解决方案3】:

      最简单的方法(假设您已经拥有最顶级的 promery 集)是调用

      myform.BringToFront();
      

      在 FIXED 但相对较小的时间间隔上(请参阅 Timer 类),通过所有时间形式必须保持在顶部。

      如果调用此方法与通知您失去在顶部蜜蜂的特权的事件相关联,则可能会导致多个应用程序之间的资源争用。安全的代价是,当他被您的程序推翻时,其他程序可能会通过收听信息来作弊,但是如果您想一直保持领先,那么您唯一的解决方案就是杀死其他程序:D

      【讨论】:

      • 我已经实现了这个,但我仍然想知道是否有更好的方法。您认为 Windows 附带的屏幕键盘如何始终保持领先地位?
      • @BrucevanderKooij,OSK.exe 并不总是保持领先,没有人这样做。它总是在没有 TopMost 属性的窗口前面,但是当你把任务管理器放在它前面,并在这两个和其他一些 Topmost=false 窗口之间改变焦点时,你会看到奇怪的焦点/最上面的错误/(资源争夺) 出现在 win7 上。如果您想确保获得所需的位置,则必须使用 win32 api 调用。我学会了使用 c# 形式的 winapi 调用,只是为了在我正在制作的字幕编写程序中完成这一点。这可能有用:stackoverflow.com/questions/916259/win32-bring-a-window-to-top
      • 我试图检查您所说的内容,但在我的 Windows 8.1 安装中,我无法让 taskmgr.exe 从 osk.exe 中窃取焦点。似乎 Windows 8.1 任务管理器甚至没有尝试保持领先。
      猜你喜欢
      • 2015-02-08
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多