我目前正在尝试用VB.NET编写一个程序,它可以在Windows 7中流畅地改变DWM窗口的着色颜色。
我首先尝试直接编辑注册表值,但我不得不重新启动UXSMS服务。由于任务栏的切换,这个解决方案并不令人满意。
我现在正在搜索user32.dll
或themecpl.dll
等DLL中的函数,它可以在设置窗口颜色时重现控制面板的行为。
我现在正在使用IDA,正在寻找适当的功能(CColorCplPage::SetDwmColorizationColor
似乎很好!)。如果有人有,请分享!
(如果有人需要屏幕或代码,请询问。抱歉我的英语不好。)
答案 0 :(得分:0)
您的首次尝试失败,因为手动编辑注册表从不是更改系统设置的正确方法。正如您所发现的,许多Windows组件(和其他应用程序!)只读取这些配置值并对其进行缓存,从而防止您的更改被传播。另一个问题(你经常会看到这个问题,我会感到惊讶)是那些试图在注册表中捣乱的应用程序通常最终会破坏事物。
相反,您应该调用记录的API来更改设置。几乎总有一种记录在案的方法,如果没有,那么你就不应该这样做。
这似乎是其中一种情况。有一个记录的DwmGetColorizationColor
函数,但是没有相应的DwmSetColorizationColor
函数,正如人们所期望的那样。
原因是用户应该是唯一可以更改其着色设置的人,而不是其他应用程序。您可能会保证不会滥用此功能,并且只会根据用户的显式请求进行此类更改,但并非所有应用程序都可以信任这样做。很多人会恶意使用它,因此这些功能尚未被记录和曝光。
但是像往常一样,如果按下,你通常可以找到一种无证件的做事方式。使用无证件功能的问题在于无法保证它们能够正常工作或继续工作。他们故意没有记录,因为他们可能会在新版本的Windows上进行更改。您只能自担风险使用它们。
在这种情况下,如果您使用像DumpBin这样的程序从DWM DLL(dwmapi.dll
)获取所有导出函数的列表,您将看到许多未记录的导出函数。
您感兴趣的是DwmGetColorizationParameters
和DwmSetColorizationParameters
。这两个函数都将COLORIZATIONPARAMS
结构作为包含所需值的参数。
因此,您需要对这些函数进行反向工程并获得适当的定义。然后,您可以调用DwmGetColorizationParameters
函数,传入COLORIZATIONPARAMS
结构以获取当前配置设置;修改包含当前着色颜色的结构的成员;然后将结构的修改版本传递给DwmSetColorizationParameters
函数。
我是否提到我不建议这样做?