人妻夜夜爽天天爽三区丁香花-人妻夜夜爽天天爽三-人妻夜夜爽天天爽欧美色院-人妻夜夜爽天天爽免费视频-人妻夜夜爽天天爽-人妻夜夜爽天天

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

.NET 窗口置于最頂層

freeflydom
2025年1月9日 9:24 本文熱度 269

本文介紹如何將窗口置于最頂層,以及解決在頂層顯示時(shí)對(duì)鎖屏登錄界面的影響等問(wèn)題。用于實(shí)現(xiàn)類似Launcher、系統(tǒng)工具等應(yīng)用需要窗口層級(jí)比Windows開(kāi)始菜單以及置頂任務(wù)欄還要高的場(chǎng)景

一般情況下的窗口置頂,可以設(shè)置WPF窗口屬性Topmost=true

也可以使用WIN32-SetWindowPos函數(shù)SetWindowPos 函數(shù) (winuser.h) - Win32 apps | Microsoft Learn,設(shè)置窗口層級(jí):


 1     /// <summary>設(shè)置窗口位置</summary>
 2     /// <param name="hwnd">窗口句柄</param>
 3     /// <param name="hWndInsertAfter">跟隨的窗口句柄</param>
 4     /// <param name="x">X軸坐標(biāo)</param>
 5     /// <param name="y">Y軸坐標(biāo)</param>
 6     /// <param name="width"></param>
 7     /// <param name="height"></param>
 8     /// <param name="uFlags">標(biāo)志位</param>
 9     /// <returns></returns>
10     [DllImport("user32.dll", SetLastError = true)]
11     public static extern bool SetWindowPos(IntPtr hwnd, IntPtr hWndInsertAfter, int x, int y, int width, int height, uint uFlags);

hWndInsertAfter,需要置頂可以傳入?yún)?shù)HWND_TOPMOST(-1)。設(shè)置后會(huì)在任務(wù)欄上方顯示(注意:不是開(kāi)始菜單顯示時(shí)的任務(wù)欄,開(kāi)始菜單顯示后任務(wù)欄層級(jí)是超級(jí)高的,置頂層級(jí)需要再次提升,下面會(huì)講到)

如果你軟件的置頂需求是常駐,需要解決與其它置頂窗口的層級(jí)沖突、搶他們的層級(jí),可以加個(gè)定時(shí)器:


 1     private nint _handle;
 2     private void MainWindow_Loaded(object sender, RoutedEventArgs e)
 3     {
 4         _handle = new WindowInteropHelper(this).Handle;
 5         SetWindowPos(_handle, -1, 0, 0, 0, 0, 1);
 6         //定時(shí)器置頂
 7         var timer = new Timer();
 8         timer.Interval = 100;
 9         timer.Elapsed += Timer_Elapsed;
10         timer.Start();
11     }
12     private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
13     {
14         SetWindowPos(_handle, -1, 0, 0, 0, 0, 1);
15     }

當(dāng)然,這種窗口置頂方案,遇上比你更流氓的軟件就GG了,會(huì)搶來(lái)?yè)屓ァ?/p>

最上層置頂(比Windows開(kāi)始菜單以及置頂任務(wù)欄還要高),根據(jù)我們MVP毅仔提供的方案 讓你的程序置頂?shù)奖认到y(tǒng)界面都更上層,就像任務(wù)管理器/放大鏡一樣絕對(duì)置頂 - walterlv,我們簡(jiǎn)單補(bǔ)充整理:

1. 添加app.manifest,并修改requestedExecutionLevel為管理員啟動(dòng)權(quán)限、添加UI置頂權(quán)限,詳細(xì)的可以了解 /MANIFESTUAC(將 UAC 信息嵌入到清單中) | Microsoft Learn

<requestedExecutionLevel level="requireAdministrator" uiAccess="true" />

這里的窗口置頂可以設(shè)置比系統(tǒng)界面更高的置頂,也就是說(shuō)可以比一些系統(tǒng)級(jí)別的置頂還要高,效果同任務(wù)管理器的絕對(duì)置頂。UiAccess可以幫應(yīng)用程序繞過(guò)用戶界面保護(hù)級(jí)別、并將輸入引導(dǎo)到桌面上的更高權(quán)限窗口

2. 給Windows設(shè)置屬性ShowInTaskbar="True"、Topmost="True",

3. 添加程序簽名

4. 將程序放在安裝目錄下C:\Program Files、C:\Program Files (x86)。確保應(yīng)用程序是從受信任的位置啟動(dòng)的,因?yàn)?Windows 對(duì) UIAccess 應(yīng)用程序的啟動(dòng)位置有嚴(yán)格限制。

啟動(dòng)后,窗口層級(jí)就比Windows開(kāi)始菜單以及設(shè)置置頂?shù)娜蝿?wù)管理器,都要高。窗口層級(jí)關(guān)系如下,桌面<一般應(yīng)用窗口<Windows開(kāi)始菜單<置頂?shù)娜蝿?wù)管理器<當(dāng)前置頂應(yīng)用Demo:

層級(jí)設(shè)置沒(méi)問(wèn)題。我們來(lái)說(shuō)下這個(gè)方案的幾個(gè)問(wèn)題

1. Windows鎖屏/登錄界面,置頂窗口也會(huì)顯示,影響了用戶操作

解決:監(jiān)聽(tīng)鎖屏/解鎖屏的事件,添加窗口Topmost修改


 1     public MainWindow()
 2     {
 3         InitializeComponent();
 4         //當(dāng)前登錄的用戶變化
 5         SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
 6     }
 7     private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
 8     {
 9         switch (e.Reason)
10         {
11             //解鎖屏
12             case SessionSwitchReason.SessionUnlock:
13                 Topmost = true;
14                 break;
15             //鎖屏
16             case SessionSwitchReason.SessionLock:
17                 Topmost = false;
18                 break;
19         }
20     }

鎖屏后窗口層級(jí)隱藏效果:

2. 任務(wù)欄圖標(biāo)如果有需求需要隱藏的話,設(shè)置窗口ShowInTaskbar=false無(wú)法隱藏圖標(biāo)

這種情況下,我磨了下代碼,可以這么操作:


1     int exStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
2     // 設(shè)置窗口樣式為工具窗口, 不在任務(wù)欄顯示
3     exStyle |= WS_EX_TOOLWINDOW;
4     SetWindowLong(hWnd, GWL_EXSTYLE, exStyle);
5     //二次設(shè)置任務(wù)欄不顯示
6     ShowInTaskbar = false;

使用SetWindowLong來(lái)設(shè)置窗口為工具窗口樣式,然后更新窗口屬性ShowInTaskbar=false:

WS_EX_TOOLWINDOW 樣式 - 此擴(kuò)展窗口樣式用于創(chuàng)建工具窗口。Windows 不將此類工具窗口視為常規(guī)應(yīng)用程序窗口,因此默認(rèn)情況下不在任務(wù)欄中顯示

ShowInTaskbar = false - WPF是通過(guò)設(shè)置ShowInTaskbar來(lái)實(shí)現(xiàn)不在任務(wù)欄中顯示。

注意:需要倆個(gè)同時(shí)設(shè)置,有uiAccess的置頂應(yīng)用才能隱藏任務(wù)欄

我猜測(cè),是uiAccess會(huì)影響窗口樣式的應(yīng)用方式,而WS_EX_TOOLWINDOW結(jié)合ShowInTaskbar,明確告訴 WPF 不要在任務(wù)欄中顯示此窗口,進(jìn)一步確保了圖標(biāo)不顯示出來(lái)。

此類場(chǎng)景置頂代碼如下:


 1     public void SetTopmost()
 2     {
 3         IntPtr hWnd = _hWnd;
 4         // 將窗口設(shè)置為頂層窗口
 5         Topmost = true;
 6 
 7         int exStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
 8         // 設(shè)置窗口樣式為工具窗口, 不在任務(wù)欄顯示
 9         exStyle |= WS_EX_TOOLWINDOW;
10         SetWindowLong(hWnd, GWL_EXSTYLE, exStyle);
11         //二次設(shè)置任務(wù)欄不顯示
12         ShowInTaskbar = false;
13     }

也可以看github倉(cāng)庫(kù)完整代碼  kybs00/WindowsShowTopDemo,需要快速驗(yàn)證置頂可以用這個(gè)WindowShowTopDemo.exe

3. 根據(jù)小伙伴反饋,應(yīng)用設(shè)置了uiAccess后,在此進(jìn)程打開(kāi)其它軟件,其它軟件內(nèi)部調(diào)用SetParent實(shí)現(xiàn)相關(guān)功能時(shí)會(huì)失敗

這個(gè)我驗(yàn)證了下確實(shí)如此。目前暫無(wú)解決方案、需要具體分析,不過(guò)保底可以通過(guò)創(chuàng)建子進(jìn)程、以進(jìn)程通信去啟動(dòng)相關(guān)應(yīng)用,來(lái)規(guī)避。

?轉(zhuǎn)自https://www.cnblogs.com/kybs0/p/18658281


該文章在 2025/1/9 9:24:52 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 丁香在线 | 免费观看又色又爽又黄的校园 | 亚洲国产一区成人 | 国产成人av免费网址 | 岛国在线观看网站 | 精品一卡2卡三卡4卡5卡 | 无码不卡中文字幕一区二区三区 | 国产一区精选播放022 | 国产精品无码一区二区三区不卡 | 91精品福利资源在线观看 | 永久免费的无码中文字幕 | 精品久久精品久久久久久乐 | 奇米精品视频一区二区三区 | 亚洲精品中文字幕无码蜜桃 | 国产精品一区理论片 | 国产精品自在线拍国产手青青机版 | 国产av无码专区亚洲av中文 | 欧美午夜色视频国产精品 | 2024天天拍拍天天爽视频 | 五月天婷婷天天综合入口 | 久久国产精品久久精品国产 | 国产精品视频二区不卡 | H 调教 红肿 嗯啊 跪趴 | 精品久久久久久蜜臂a | 1区2区3区4区产品乱码芒果精品神马在线播放 | 魯鲁狠狠狠7777一区二区 | 国产福利一区二区精品免费 | 亚洲精品免费网站 | 国内毛片免费播放 | 日韩精品一区二区三区线观看人 | 国产91无码一区二区三区免费 | 久久伊人精品波多野结衣 | 欧美激情在线观看一 | 亚洲国产成a人v在线观看 | 免费人妻不卡中文字幕 | 国产成人a视频高清在线观看 | 自慰网大全在线观看 | 亚洲情在线 | av中文字幕不卡首页 | 亚洲国产欧美一区二区三区 | 久久无码精品一一区二区三区 |