首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在.Net中使窗口始终位于顶部?

如何在.Net中使窗口始终位于顶部?
EN

Stack Overflow用户
提问于 2009-03-25 20:33:06
回答 11查看 223.6K关注 0票数 107

我有一个C# winforms应用程序,可以在另一个程序中运行宏。另一个程序会不断地弹出窗口,通常会让事情看起来疯狂,因为没有更好的词。我想实现一个cancel按钮来停止进程的运行,但是我似乎不能让窗口保持在顶部。我如何在C#中做到这一点?

编辑:我试过TopMost = true;,但另一个程序总是在顶部弹出它自己的窗口。有没有办法每隔n毫秒就把我的窗口发送到顶端?

编辑:我解决这个问题的方法是添加一个系统托盘图标,双击它就可以取消这个过程。系统托盘图标未被遮盖。感谢所有回复的人。我读了一篇文章,关于为什么没有“超级顶部”窗口……它在逻辑上是行不通的。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-03-25 20:38:06

除非另一个程序创建的是最顶层的窗口,否则Form.TopMost将会工作。

没有办法创建一个没有被另一个进程的最上面的新窗口所覆盖的窗口。雷蒙德陈explained为什么。

票数 190
EN

Stack Overflow用户

发布于 2016-01-10 16:51:33

我一直在努力使我的WinForms应用程序“总是在顶部”,但是设置"TopMost“对我没有任何帮助。我知道这是可能的,因为WinAmp做到了这一点(以及许多其他应用程序)。

我所做的是调用“user32.dll”。我对这样做没有任何顾虑,而且它工作得很好。不管怎样,这是一种选择。

首先,导入以下命名空间:

代码语言:javascript
复制
using System.Runtime.InteropServices;

在类声明中添加几个变量:

代码语言:javascript
复制
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
private const UInt32 SWP_NOSIZE = 0x0001;
private const UInt32 SWP_NOMOVE = 0x0002;
private const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;

为user32.dll函数添加原型:

代码语言:javascript
复制
[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

然后在您的代码中(我在Form_Load()中添加了调用),添加调用:

代码语言:javascript
复制
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);

希望这能有所帮助。Reference

票数 60
EN

Stack Overflow用户

发布于 2012-08-22 05:10:02

如果你所说的“疯狂”是指每个窗口不断地从另一个窗口窃取焦点,那么TopMost不会解决这个问题。

相反,请尝试:

代码语言:javascript
复制
CalledForm.Owner = CallerForm;
CalledForm.Show();

这将显示“孩子”形式,而不会偷走它的焦点。子窗体也将停留在其父窗体的顶部,即使父窗体被激活或聚焦也是如此。只有当您从所有者窗体中创建子窗体的实例时,此代码才能轻松工作。否则,您可能需要使用API设置所有者。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/683330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档