C#修改win64注册表,解决无法修改的问题

问题描述:需要修改系统注册表的值,总是修改的为32位对应的注册表,而不是64位下的注册表。

使用powershell直接输入命令:

reg add "HKLM\SOFTWARE\Microsoft\HoloLens" /v DisableMotionControllerForTesting /t REG_DWORD /d 1 /f

对应的注册表目录计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HoloLens DisableMotionControllerForTesting 修改为1,修改完成。并且查看注册表中对应的列表,发现数据已经更改。

在C#代码中修改注册表中对应的目录下的健值,路径没有错误,但是运行后发现,值一直未被修改。编写了一个.bat文件,单独运行脚本文件,对应注册表中的值修改;C#代码中调用.bat文件,运行后注册表中的值仍未变。

分析:有网友指出,我的程序是32位的,在64位的机子上运行的32位运行方式。修改的是对应注册表中的32位的,而不是我想要修改的64位对应的注册表。查看注册表中的信息,发现C#中每次运行代码修改注册表,对应的32位目录下的值发生改变,目录为:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\HoloLens。

采用网友的方法:项目-属性-生成里,把目标平台改成x64(我用的64位电脑)。但是此方法对我来说并没有作用,我的运行结果仍改变的为WOW6432Node目录下的值。

将目标平台改为anyCPU或者其他,对我的程序来说,都没有什么作用。

后面采用网友的方式:

方法1:在c#中使用代码进行注册表的修改,这种方式修改的对应WOW6432Node目录下的值。

            string[] sVauleNameColl;
            RegistryKey hklm = Registry.LocalMachine;
            RegistryKey test = hklm.CreateSubKey(@"SOFTWARE\Microsoft\HoloLens\test");//对应目录下创建变量
            RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\Microsoft\HoloLens",true);//后面有参数true,才可以进行修改等操作。

            string[] sKeyNameColl1 = hkSoftWare.GetSubKeyNames();
            sVauleNameColl = hklm.GetValueNames();
            string sValue = hkSoftWare.GetValue("DisableMotionControllerForTesting").ToString();//读取其值
            hkSoftWare.SetValue( "DisableMotionControllerForTesting", 0x00000001, RegistryValueKind.DWord);//修改变量
            string sValue2 = hkSoftWare.GetValue("DisableMotionControllerForTesting").ToString();//读取其值
            hklm.Close();
            hkSoftWare.Close();

方法2:使用脚本文件调用修改

cls
 @echo off
 title 获取管理员权限
mode con cols=100 lines=20
 color 3f


:: 开始获取管理员权限
setlocal
 set uac=~uac_permission_tmp_%random%
 md "%SystemRoot%\system32\%uac%" 2>nul
 if %errorlevel%==0 ( rd "%SystemRoot%\system32\%uac%" >nul 2>nul ) else (
     echo set uac = CreateObject^("Shell.Application"^)>"%temp%\%uac%.vbs"
     echo uac.ShellExecute "%~s0","","","runas",1 >>"%temp%\%uac%.vbs"
     echo WScript.Quit >>"%temp%\%uac%.vbs"
     "%temp%\%uac%.vbs" /f
     del /f /q "%temp%\%uac%.vbs" & exit )
 endlocal
:: 完成获取,下面可以开始写你自己的代码了


::cd /d %~dp0
::echo %cd%\
::echo cd /d %%~dp0

Echo **Change Register Keys**
ping -n 1 127.0.0.1 >nul
reg add "HKLM\SOFTWARE\Microsoft\HoloLens" /v DisableMotionControllerForTesting /t REG_DWORD /d 1 /f
pause

最终解决方法:

先判断当前是32位系统还是64位系统,打开对应的注册表,对其值作相应的修改。

  RegistryKey localKey;
  if (Environment.Is64BitOperatingSystem)
     localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
  else
     localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
  string value = localKey.OpenSubKey(@"SOFTWARE\Microsoft\HoloLens").GetValue("DisableMotionControllerForTesting").ToString();

  RegistryKey hkSoftWare = localKey.OpenSubKey(@"SOFTWARE\Microsoft\HoloLens", true);
  hkSoftWare.SetValue("DisableMotionControllerForTesting", 0x00000001, RegistryValueKind.DWord);

代码中,首先Environment.Is64BitOperatingSystem判断是否为64位的操作系统,然后通过注册表打开目录,传入相应的RegisterView枚举即可。这个地方调用的为OpenBaseKey方法。然后读取一下对应的值,是否为64位下的值。将其值进行修改。


猜你喜欢

转载自blog.csdn.net/yanhuatangtang/article/details/81028644