【C#】.NET Core 如何判斷程序是否在遠(yuǎn)程桌面(RDP)下運(yùn)行
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
導(dǎo)語 由于疫情的關(guān)系,很久沒發(fā)文章了。今天終于穩(wěn)定下來在家辦公,抽空分享一個(gè)剛學(xué)會的技巧。最近在家辦公的程序員可能避免不了要用遠(yuǎn)程桌面,那么問題來了,你的 .NET Core 程序有沒有辦法知道自己是否在 Windows 遠(yuǎn)程桌面環(huán)境下運(yùn)行呢? Windows Forms 如果你用的是 .NET Core 3.x 版本,并開發(fā)的是 Windows Forms 應(yīng)用,那么恭喜你,.NET 自帶了一個(gè)簡單粗暴的方法。 SystemInformation.TerminalServerSession 即可返回當(dāng)前會話是否在遠(yuǎn)程桌面下。 public partial class Form1 : Form { public Form1() { InitializeComponent(); if (IsRemoteSession) { MessageBox.Show("Under RDP"); } } public static Boolean IsRemoteSession => SystemInformation.TerminalServerSession; } 運(yùn)行效果 去你的 WinForms? Bing 不是人人都喜歡 WinForms,畢竟它代表落后、不思進(jìn)取的拖控件程序員(即使他們下班時(shí)候天還亮著)。那么其他類型的 .NET Core 程序如何判斷自己是否在 RDP 下運(yùn)行呢?我們需要 P/Invoke 騷操作。 .NET Core 使用 P/Invoke 的姿勢和 .NET Framework 幾乎一致。只要一個(gè) [DllImport] 標(biāo)記即可。 根據(jù)田牌文檔描述,Windows 本身就帶有一個(gè) Win32 API可以返回當(dāng)前會話是否為遠(yuǎn)程桌面。即 User32.dll 上的 GetSystemMetrics( SM_REMOTESESSION ); 方法 文檔傳送門:https://docs.microsoft.com/en-us/windows/win32/termserv/detecting-the-terminal-services-environment 其中的 SM_REMOTESESSION 其實(shí)是個(gè)預(yù)定義的 int 值,在 C# 中可表示為 0x1000。使用 P/Invoke 判斷一個(gè) Console 程序是否運(yùn)行在 RDP 下的代碼如下: static void Main(string[] args) { bool isRDP = GetSystemMetrics(SM_REMOTESESSION); Console.WriteLine($"Running under RDP: {isRDP}"); Console.ReadKey(); } const int SM_REMOTESESSION = 0x1000; [DllImport("user32")] static extern bool GetSystemMetrics(int index); 其中 user32 后面的 .dll 可以省略。.NET Core 在 Windows 上會自動去找 dll,在 Linux 上會去找 so (即使 Linux Bing 沒有 RDP 這個(gè)東西也沒有 user32 這個(gè)庫) 運(yùn)行效果
不過這種技巧大家平時(shí)正常寫代碼的時(shí)候一定要盡量避免,在 .NET 的托管環(huán)境下調(diào)用非托管代碼不僅會導(dǎo)致程序和平臺及系統(tǒng)版本耦合,還易爆,爆完還難以抓異常信息。有關(guān) P/Invoke 的詳細(xì)介紹,請參考微軟文檔: https://docs.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke 該文章在 2021/3/16 0:20:42 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |