WinForm 使用 Win32 API 实现的无边框窗口

打印 上一主题 下一主题

主题 946|帖子 946|积分 2838

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 堆栈,有兴趣的朋友可以自行拉去研究。
第三方库

使用阐明

不出意外的话,直接打开项目就可以运行了。运行后将打开一个无边框的窗体,你可以通过以下快捷键进行操作:

  • 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 我并没有太深入的研究,所以如果有朋友知道如何解决接待交换。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表