注销时更改注册表(或On ??)

时间:2013-11-12 17:31:14

标签: c# windows-7 registry dpi

摘要

我在64位Windows 7上使用C#.NET 4.0 Framework写入注册表,我写的其中一个值似乎在我注销时更改(或者,我无法分辨),但仅限于我第一次注销并重新开始。

请帮助我理解我所缺少的内容。

全文

在我们开始之前,有正当理由这样做,所以请不要告诉我“啊!!永远不要这样做!!”我理解,在一般情况下,这不是你想要对某人的计算机做的事情。对于运行嵌入式系统的特定计算机,这是一个受控的有限分布范围。

有了这个警告,我试图以编程方式将DPI更改为96,窗口边框宽度变得非常小。看起来我可以成功地完成其中一个,但是这两个都可以互相踩踏。

为了进行测试,我使用下面屏幕截图中显示的控制面板工具将DPI修改为错误的设置,然后运行我的程序,如下所示的片段。 enter image description here

以下是代码:

       Microsoft.Win32.Registry.SetValue("HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics\\", "AppliedDPI", 0x60); // fix the DPI.
       Microsoft.Win32.Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontDPI", "LogPixels", 0x60);
       Microsoft.Win32.Registry.SetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Hardware Profiles\\0000\\Software\\Fonts", "LogPixels", 0x60);
       Microsoft.Win32.Registry.SetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Hardware Profiles\\0001\\Software\\Fonts", "LogPixels", 0x60);
       Microsoft.Win32.Registry.SetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Hardware Profiles\\Current\\Software\\Fonts", "LogPixels", 0x60);
       Microsoft.Win32.Registry.SetValue("HKEY_CURRENT_USER\\Control Panel\\Desktop", "LogPixels", 0x60);
       Microsoft.Win32.Registry.SetValue("HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics\\", "BorderWidth", "-15"); // fix the border width.
       Microsoft.Win32.Registry.SetValue("HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics\\", "PaddedBorderWidth", "-15"); // fix the border width.

现在,为了让Windows 7实际应用这些更改,我必须注销并重新开启。在注销之前,如果我查看注册表,我会看到上面的值都显示为我希望它们。一旦我注销并重新开启,PaddedBorderWidth就会变成-60而不是-15。我不认为它与列表中的最后一个PaddedBorderWidth有关。我首先尝试了相同的结果。

我认为Windows 7有一些其他Windows主题的东西仍然保持窗口边框宽度,并导致登录或注销。一旦我重新登录,如果我再次运行我的C#程序,这次设置会坚持下去。这再次指出了我仍然坚持的Windows主题。

我不知道为什么也不知道如何制止这一点。有人能指出我正确的方向吗?

更新

实验上我确定边框宽度只有在我更改"HKEY_CURRENT_USER\Control Panel\Desktop\LogPixels然后注销然后重新开启时才会更改。不幸的是,这是我真正需要改变的关键之一。似乎更改LogPixels会触发某种边框宽度默认值。有什么想法吗?

同样,我知道这是一个非常不标准的事情,但这就是生活。

解决方法更新 我通过创建一个小的可执行文件来解决此问题,该可执行文件在作为提升用户运行时设置这些注册表在帮助文件中,如果GUI看起来不正确,则告知用户运行此操作,然后他们必须注销并重新打开。如果它看起来仍然不正确,他们必须再次进行,此时,设置将最终坚持下去。

虽然这“解决了”这个问题,但我感到非常不满意,因为我觉得应该有一个漂亮,干净的技术修复,所以用户从不必须这样做,但我是没时间了,不得不发货。如果有人想出更好的方法,请大声说出来。我很乐意为下一次修改解决这个问题。

希望将来的某个时候我们可以将GUI修复为DPI感知,但这比使用这个遗留代码要容易得多。

0 个答案:

没有答案