WinForm 使用 Win32 API 實現的無邊框窗口
WinForm 使用 Win32 API 實現的無邊框窗口

前言
時光荏苒,轉眼已近是2025年了。不知不覺兩年多沒有研究代碼了,在這期間 .NET 10 都快 RC 了,前幾天刷手機看到張隊公眾號里有關于 .NET 9.0 AOT 發布的內容,所以寫了這些代碼來測試一下 AOT 編譯的效果,并評估未來是否開發支持 AOT 編譯的 NanUI 新版本。
關于 NanUI 項目,如果你還不了解,可以通過這個鏈接了解。
項目介紹
這個項目參考了老外的 C++ 代碼,我用 C# 代碼基于 WinForm 進行開發實現了一個簡單的無邊框窗口。其實在 NanUI 項目了已經有現成的無邊框窗口實現,但那是基于 Form 類實現的。作為 Cef 瀏覽器的承載窗口其實只需要簡單的窗體功能,Form 類提供的東西太多太雜反而在不同的 .NET 版本中還存在各種奇奇怪怪的問題。
所以我計劃在未來版本的 NanUI 項目中,承載窗體將直接使用了 Win32 API 來創建,這樣可以更好的統一窗體的行為。
本來這個項目可以使用純 Win32 API 來實現,為什么我還是基于 WinForm 項目來編寫呢?因為我懶得處理消息循環、DPI縮放等等問題, WinForm 已經幫我們處理好了。
目前代碼已經推至 Gitee 倉庫,有興趣的朋友可以自行拉去研究。
第三方庫
- Vanara - MIT License
使用說明
不出意外的話,直接打開項目就可以運行了。運行后將打開一個無邊框的窗體,你可以通過以下快捷鍵進行操作:
- F1 : 在普通窗體和無邊框窗體之間進行實時切換
- F2 : 在無邊框窗體模式切換 DWM 的窗體陰影效果(Win7/Win10/Win11)
- F3 : 在無邊框窗體模式切換拖動窗體移動功能
- F4 : 切換窗體的拖動改變大小功能
關于 AOT 編譯
當前代碼已經支持 .NET 9.0 AOT 編譯,并且已經在 Windows 10 x64 系統和 Windows 11 上測試通過。如果你需要在其他平臺上運行,請自行測試。
我在代碼中嘗試使用 WS_EX_NOREDIRECTIONBITMAP 來創建無重定向表面的窗口,并用 DwmSetWindowAttribute 方法設置 DWM_SYSTEMBACKDROP_TYPE 屬性來啟用 Windows 11 系統下面的 Mica 窗體背景特效。但可能是 Vanara 庫的問題,一旦使用了 DwmSetWindowAttribute 方法,那么 AOT 編譯后的程序運行就會崩潰。這個問題我還沒有找到解決方案,我已經到 Vanara 的項目主頁提交了 Issue,目前還沒有得到該項目作者的回復。
由于 AOT 我并沒有太深入的研究,所以如果有朋友知道如何解決歡迎交流。

浙公網安備 33010602011771號