问题描述:需要修改系统注册表的值,总是修改的为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位下的值。将其值进行修改。