原创 C# implicit隱式轉換

今天看書,上面介紹implicit和explicit相對冷門,用的較少。 這個implicit類型雖然冷門,但真的很有用。我在自己的項目裏就用了這個 上Demo, 1 public partial class MainWindo

原创 Nuget 多項目複合打包

我這裏有個進程間通信組件,用於提供多應用間通信的解決方案。 進程間通信,分爲客戶端和服務端,倆端肯定會有些共性代碼,所以加了個H3C.Channel.Core項目 因爲之前還不太瞭解nuget這塊,然後我就踩到了坑: 引用H3C.Chan

原创 C# 筆跡擦除8邊形

擦除區域與橡皮大小不一致 測試反饋,擦除區域與真實的橡皮大小不一致:   上圖中,橡皮顯示是圓形的,但擦除效果是一個“8邊形”區域。 找了一臺8K屏,確實是能復現的: 看到這個詭異的8邊形,一開始我是以爲是逗逼小夥伴在手勢識別模塊寫出來的

原创 C# 控制檯主線程、WPF應用主線程

控制檯應用,程序的主線程是工作線程。 所以如果在控制檯應用中,彈出窗口,需要額外創建STA線程,如下所示: 另外,通過調試我們看到,控制檯主線程跑完後,其實就銷燬掉了。   如果是WPF應用程序,主線程是UI線程,從App的初始化位置可以

原创 C# 獲取系統已安裝的.NET版本

獲取系統已安裝的.NET版本,來確定當前應用可運行的環境。   微軟已經有相應的完整文檔,請參考:確定已安裝的 .NET Framework 版本 - .NET Framework | Microsoft Docs Release根據文檔

原创 C# 信號鎖SemaphoreSlim

關於鎖,我們經常會使用lock object對象,進行資源訪問的限制。 但,lock是有限制的,無法添加異步方法。編譯器會報錯。 下面推薦另一個類SemaphoreSlim,這是信號量的一個使用類。先看下面的使用: 1 pri

原创 WebSocket 服務端未啓動時,客戶端重連報錯

當WebSocket服務端未啓動時,我們在客戶端申請連接,會報 System.Net.Sockets.SocketException 異常。 當然,我們調試時異常設置默認是不勾選這個的。所以不影響正常調試。 但小夥伴發現,依然會影響界面卡

原创 C# 禁用窗口激活

如果界面點擊時,不想讓窗口激活,可以按如下操作: 1 public MainWindow() 2 { 3 InitializeComponent(); 4 SourceInitial

原创 C# 獲取指定窗口的上層窗口

 如何獲取當前窗口層級上方的所有窗口信息 User32有函數GetWindow function (winuser.h) - Win32 apps | Microsoft Docs,可以根據已知窗口句柄,獲取指定類型的窗口。 1

原创 C# 根據窗口句柄獲取窗口截圖

本章介紹如何通過句柄,截取指定窗口內容,以及截取失敗的場景 一、根據窗口句柄獲取窗口截圖 先創建一個測試窗口程序A,顯示如下: 同時我們把此窗口的句柄顯示到一個文本輸入框內。 1 TestBox.Text = new Windo

原创 VS 查看引用的DLL/Nuget包源碼時,無法看到註釋

一、問題描述 在下面的截圖中,我們發現,源碼有添加一段註釋。 然後通過Nuget包引用,在VS中用Reshaper反編譯時,發現沒有註釋: 原來,DLL是默認不帶註釋的。即你生成一個DLL,給另一個項目引用,使用時看不到原有的註釋。 二、

原创 C# 顯示、隱藏窗口對應的任務欄

WPF中全屏窗口,會自動隱藏任務欄。 那非全屏窗口如何隱藏任務欄?甚至有沒有一種場景,隱藏任務後自定義一套系統任務欄來顯示? 以下會分階段講述一些概念,任務欄、查找窗口、控制窗口顯示。 1. 主屏任務欄 任務欄,其實也是一個窗口,主屏的任務

原创 WPF Window設置ResizeMode="NoResize"

WPF窗口設置屬性ResizeMode="NoResize"時,回到桌面後,點擊任意應用,都會將此窗口激活。 我們來看下詳細操作: 1. WPF窗口設置屬性ResizeMode 2. 啓動測試程序,顯示窗口 3. 在任務欄的右鍵菜單中,點

原创 Reshaper 代碼清理工具

reshaper是個好工具,能幫助我們提升開發效率,比如本文要介紹的全局代碼清理功能。 如果你的VS安裝了reshaper,可以通過Ctrl+E+C快捷鍵打開代碼清理窗口。 代碼清理,可以格式化多種文件內的內容、優化using引用、優化各

原创 C# 反射 判斷類型是否是列表

1 /// <summary> 2 /// 判斷類型是否爲可操作的列表類型 3 /// </summary> 4 /// <param name="type"></param> 5 ///