更改dwm着色 - Windows 7

时间:2011-12-19 14:42:44

标签: vb.net windows-7 dwm

我目前正在尝试用VB.NET编写一个程序,它可以在Windows 7中流畅地改变DWM窗口的着色颜色。

我首先尝试直接编辑注册表值,但我不得不重新启动UXSMS服务。由于任务栏的切换,这个解决方案并不令人满意。

我现在正在搜索user32.dllthemecpl.dll等DLL中的函数,它可以在设置窗口颜色时重现控制面板的行为。

我现在正在使用IDA,正在寻找适当的功能(CColorCplPage::SetDwmColorizationColor似乎很好!)。如果有人有,请分享!

(如果有人需要屏幕或代码,请询问。抱歉我的英语不好。)

1 个答案:

答案 0 :(得分:0)

您的首次尝试失败,因为手动编辑注册表从不是更改系统设置的正确方法。正如您所发现的,许多Windows组件(和其他应用程序!)只读取这些配置值并对其进行缓存,从而防止您的更改被传播。另一个问题(你经常会看到这个问题,我会感到惊讶)是那些试图在注册表中捣乱的应用程序通常最终会破坏事物。

相反,您应该调用记录的API来更改设置。几乎总有一种记录在案的方法,如果没有,那么你就不应该这样做。

这似乎是其中一种情况。有一个记录的DwmGetColorizationColor函数,但是没有相应的DwmSetColorizationColor函数,正如人们所期望的那样。

原因是用户应该是唯一可以更改其着色设置的人,而不是其他应用程序。您可能会保证不会滥用此功能,并且只会根据用户的显式请求进行此类更改,但并非所有应用程序都可以信任这样做。很多人会恶意使用它,因此这些功能尚未被记录和曝光。

但是像往常一样,如果按下,你通常可以找到一种无证件的做事方式。使用无证件功能的问题在于无法保证它们能够正常工作或继续工作。他们故意没有记录,因为他们可能会在新版本的Windows上进行更改。您只能自担风险使用它们。

在这种情况下,如果您使用像DumpBin这样的程序从DWM DLL(dwmapi.dll)获取所有导出函数的列表,您将看到许多未记录的导出函数。

您感兴趣的是DwmGetColorizationParametersDwmSetColorizationParameters。这两个函数都将COLORIZATIONPARAMS结构作为包含所需值的参数。

因此,您需要对这些函数进行反向工程并获得适当的定义。然后,您可以调用DwmGetColorizationParameters函数,传入COLORIZATIONPARAMS结构以获取当前配置设置;修改包含当前着色颜色的结构的成员;然后将结构的修改版本传递给DwmSetColorizationParameters函数。

我是否提到我不建议这样做?