Ale*_*fie 10 c# vb.net winapi titlebar windows-vista
我在StackOverflow上发现了这个问题.基本上,用户想要在标题栏上绘制自定义按钮.
我尝试了代码,并且只有在Aero被禁用时才意识到它在vista/7中有效.我的问题是,在启用aero的同时,有没有办法在标题栏上绘制自定义按钮 ?
此外,有没有办法从当前主题中读取信息,所以我可以设置我的按钮样式以匹配现有的按钮.
更新
这是我的计算机的屏幕截图,展示了上述概念.安装DisplayFusion后,我得到了额外的标题栏按钮.

我知道DisplayFusion是一个.NET程序,因为它在.NET Reflector中打开.缺点是程序被混淆了.不喜欢我想反编译程序或任何东西; 我只想在标题栏上添加一个按钮来执行其他操作(例如,最小化到系统托盘).
下面是截图,证明该程序是一个.NET应用程序.

我对此做了一些研究,因为我也在自己的多显示器解决方案中实现了这一点。DisplayFusion 和 TeamViewer 实现此功能的方式是将自定义表单覆盖在包含按钮的所需窗口上。您可以使用 Spy++ 来确认这一点。
这是总体思路:
GetWindow通过和SetWindowPosAPI获取和设置 Z 位置。
请注意,DLL 必须用本机语言编写。但是,您可以使用类似的方法来解决该问题:
Using Window Messages to Implement Global System Hooks in C#
这是我的结果:

小智 4
只要您愿意重绘整个标题栏内容,就可以使用 DWM API 的 DwmExtendFrameIntoClientArea 方法,该方法涉及将窗口设置为没有标题栏,从而允许 DWM 将其玻璃绘制到您的可用区域中以创建一个新空间看起来像标题栏,但实际上位于您的客户区域中,以便您可以在其上绘制按钮。
这种方法的缺点是,如果您需要的话,您必须制作标准按钮。重新创建最小化、最大化和关闭没有问题(尽管您会发现最大化按钮是一个切换按钮,其外观基于状态),但您可能会发现重新创建左上角按钮时遇到问题。当然,您还必须重新绘制标题,但我无法想象您对此会有任何问题。
至于读回当前主题的数据以将按钮重新设计为他们的按钮,很抱歉,但我对此一无所知。我的建议是在标题栏上构建按钮时使用透明度,并使用半透明发光效果等。这样您就可以保留玻璃背景,并通过覆盖半透明颜色简单地修改其外观。另外,如果你这样做,那么玻璃上不断变化的镜面高光就会自然移动,而如果你只是获得它们的主题颜色,你会发现要么你无法访问它们的反射,要么它们在内部重新创建按钮的空间。当然,只是我的两分钱 - 如果你能找到一种方法来制作你的主题颜色等等,无论如何。
不过,有一个警告 - 还有另一个 StackOverflow 线程 (http://stackoverflow.com/questions/2666979/net-framework-4-0-and-drawing-on-aero-glass-issue/4656182#4656182) 这是描述了 DWM API DwmExtendFrameIntoClientArea 方法的问题,因此,如果我是您,我会在尝试此解决方案之前通读该内容。