【问题标题】:Is it possible to make a window always on top of another window only?是否可以使一个窗口始终仅位于另一个窗口的顶部?
【发布时间】:2019-09-26 03:58:14
【问题描述】:

在 WPF 中是否可以在另一个外部进程窗口中创建一个“始终位于顶部”的窗口?

假设我希望我的应用程序始终只显示在“notepad.exe”窗口上?

【问题讨论】:

  • 如果有另一个应用程序也想“始终在最前面”怎么办? ;)
  • 如果其他应用程序不是您可以控制的,您就无法赢得永远领先的战斗。我建议您考虑设置 topmost true then false 是否足以满足您的需求。和不。这不会让它留在记事本上。除非您获得记事本的源代码并使您的窗口成为子窗口。您可以计算出您的窗口在哪里,然后计算出所有其他窗口并决定设置在最顶层。但是其他一些应用也可以做到这一点。

标签: c# .net wpf windows


【解决方案1】:

您正在寻找SetWindowPos 函数。在 C# 中,您可以这样实现包装器:

[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

您可以在pinvoke 上了解有关您可以传递的支持参数的更多信息 - 您需要可靠地识别进程的窗口句柄,然后覆盖窗口。

【讨论】:

  • 这不会做 OP 想要的。您可以使用 SetWindowPos() 函数将窗口设为“最顶层”(始终位于 每个 窗口的顶部,当然除了所有其他也将自己设为“最顶层”但之后你的),你可以用它来暂时将你的窗口以 z 顺序定位在另一个窗口之上(例如 notepad.exe 窗口)。但是您不能以这种方式使您的“应用程序始终仅显示在“notepad.exe”窗口上”,即确保即使用户单击 notepad.exe 窗口,您的窗口保持领先。
  • @PeterDuniho 你是对的,因此“可靠地识别进程的窗口句柄”部分。始终找出覆盖位置的非零努力。
  • 我不明白你的意思。识别窗把手是容易的部分。 SetWindowPos() 文档页面中根本没有出现“覆盖”一词。您的答案中的任何陈述都不能帮助 OP 实现他们的目标。
  • “检测记事本窗口在堆栈中的位置的逻辑”——这不是重点,也不是必需的。找到notepad.exe 窗口句柄(这很简单)后,他们只需将其作为hWndInsertAfter 传递给SetWindowPos()。问题是这只是一次性的事情。一旦用户点击notepad.exe 窗口,它就会被带到前面,在其他程序的窗口之前。您谈论的关于检查现有 z 顺序的所有内容都是无关紧要的。这不是必需的,而且这样做对永久更改 z 顺序没有任何帮助。
  • 呃,所以:您的建议是连续运行,一遍又一遍地反复设置窗口 z 顺序,无限期?作为用户,我会毫不客气地带着偏见删除我在计算机上发现的任何可笑的软件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多