.NET 窗口置于最顶层

打印 上一主题 下一主题

主题 863|帖子 863|积分 2589

本文介绍如何将窗口置于最顶层,以及办理在顶层显示时对锁屏登录界面的影响等问题。用于实现类似Launcher、体系工具等应用必要窗口层级比Windows开始菜单以及置顶使命栏还要高的场景
一样平常环境下的窗口置顶,可以设置WPF窗口属性Topmost=true
也可以使用WIN32-SetWindowPos函数SetWindowPos 函数 (winuser.h) - Win32 apps | Microsoft Learn,设置窗口层级:
  1. 1     /// <summary>设置窗口位置</summary>
  2. 2     /// <param name="hwnd">窗口句柄</param>
  3. 3     /// <param name="hWndInsertAfter">跟随的窗口句柄</param>
  4. 4     /// <param name="x">X轴坐标</param>
  5. 5     /// <param name="y">Y轴坐标</param>
  6. 6     /// <param name="width">宽</param>
  7. 7     /// <param name="height">高</param>
  8. 8     /// <param name="uFlags">标志位</param>
  9. 9     /// <returns></returns>
  10. 10     [DllImport("user32.dll", SetLastError = true)]
  11. 11     public static extern bool SetWindowPos(IntPtr hwnd, IntPtr hWndInsertAfter, int x, int y, int width, int height, uint uFlags);
复制代码
hWndInsertAfter,必要置顶可以传入参数HWND_TOPMOST(-1)。设置后会在使命栏上方显示(注意:不是开始菜单显示时的使命栏,开始菜单显示后使命栏层级是超级高的,置顶层级必要再次提拔,下面会讲到)
如果你软件的置顶需求是常驻,必要办理与其它置顶窗口的层级冲突、抢他们的层级,可以加个定时器:
  1. 1     private nint _handle;
  2. 2     private void MainWindow_Loaded(object sender, RoutedEventArgs e)
  3. 3     {
  4. 4         _handle = new WindowInteropHelper(this).Handle;
  5. 5         SetWindowPos(_handle, -1, 0, 0, 0, 0, 1);
  6. 6         //定时器置顶
  7. 7         var timer = new Timer();
  8. 8         timer.Interval = 100;
  9. 9         timer.Elapsed += Timer_Elapsed;
  10. 10         timer.Start();
  11. 11     }
  12. 12     private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
  13. 13     {
  14. 14         SetWindowPos(_handle, -1, 0, 0, 0, 0, 1);
  15. 15     }
复制代码
当然,这种窗口置顶方案,遇上比你更流氓的软件就GG了,会抢来抢去。
最上层置顶(比Windows开始菜单以及置顶使命栏还要高),根据我们MVP毅仔提供的方案 让你的程序置顶到比体系界面都更上层,就像使命管理器/放大镜一样绝对置顶 - walterlv,我们简单补充整理:
1. 添加app.manifest,并修改requestedExecutionLevel为管理员启动权限、添加UI置顶权限,详细的可以了解 /MANIFESTUAC(将 UAC 信息嵌入到清单中) | Microsoft Learn

这里的窗口置顶可以设置比体系界面更高的置顶,也就是说可以比一些体系级别的置顶还要高,效果同使命管理器的绝对置顶。UiAccess可以帮应用程序绕过用户界面掩护级别、并将输入引导到桌面上的更高权限窗口
2. 给Windows设置属性ShowInTaskbar="True"、Topmost="True",
3. 添加程序签名

4. 将程序放在安装目录下C:\Program Files、C:\Program Files (x86)。确保应用程序是从受信任的位置启动的,由于 Windows 对 UIAccess 应用程序的启动位置有严格限制。

启动后,窗口层级就比Windows开始菜单以及设置置顶的使命管理器,都要高。窗口层级关系如下,桌面

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表