1

概括

我在 64 位 Windows 7 上使用 C# .NET 4.0 Framework 写入注册表,当我注销(或打开,我不知道)时,我写入的其中一个值似乎发生了变化,但只是第一次我注销并重新登录。

请帮助我了解我所缺少的。

全文

在我们开始之前,这样做是有正当理由的,所以请不要告诉我“啊!!永远不要这样做!!” 我知道在一般情况下,这不是您想要对某人的计算机执行的操作。这是针对运行嵌入式系统的特定机器的受控、有限分发。

有了这个警告,我试图以编程方式将 DPI 更改为 96,并将窗口边框宽度更改为非常小。似乎我可以成功地做一个或另一个,但是做它们都会互相踩踏。

为了测试,我使用下面屏幕截图中显示的控制面板工具将 DPI 修改为错误的设置,然后运行我的程序,片段如下所示。 在此处输入图像描述

这是代码:

       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 感知,但这比使用这个遗留代码更容易说。

4

0 回答 0