我試圖從我的Java應用程序更改註冊表值。我用命令:使用getRuntime()更改註冊表項的值exec(cmd)不會更改註冊表值,即使操作已成功結束
LoudnessEqualizationToggle.execCmdNoReturn("reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\\Render\\"+guid+"\\FxProperties\""
+ " /f /v \"{E0A941A0-88A2-4df5-8D6B-DD20BB06E8FB},4\" /t REG_DWORD /d \""+((activateLEOnKey) ? 1 : 0)+"\"");
其中GUID是{d348b8e8-3118-4a9c-9b43-422647b555ca}
activateLEOnKey是布爾值
execCmdNoReturn功能:
public static final void execCmdNoReturn(String cmd) {
try {
Scanner s = new Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A");
System.out.println("Command:"+cmd);
System.out.println("Printing executed data");
while (s.hasNext()) {
System.out.println(s.next());
}
} catch (IOException ex) {
Logger.getLogger(LoudnessEqualizationToggle.class.getName()).log(Level.SEVERE, null, ex);
}
}
一切正常o凱。我得到的輸出到命令提示符:
操作成功完成
於是我開始註冊表編輯器以驗證是否值已更改,但讓我吃驚的什麼都沒有改變。該值與以前相同。
我有權限嗎?是
我使用批處理文件執行我的應用程序以管理員身份運行。
批處理文件:
cd %~dp0
java -jar LoudnessEqualizationToggle.jar
pause
從創建快捷方式,並以管理員身份運行。
您是該密鑰的擁有者嗎?是
我使用批處理文件測試了我的命令和權限,如果Windows註冊表中的當前值0
可以按預期更改爲1
。該測試
批處理文件是:
cd %~dp0
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{d348b8e8-3118-4a9c-9b43-422647b555ca}\FxProperties" /f /v "{E0A941A0-88A2-4df5-8D6B-DD20BB06E8FB},4" /t REG_DWORD /d "1"
net stop audiosrv //just restarting audio down here , not important
net stop AudioEndpointBuilder
net start audiosrv
net start AudioEndpointBuilder
pause
的值已在Windows註冊表從0到1(期望的動作)的批處理文件執行後改變。
因此,當我直接從命令提示符窗口運行我的命令時,我可以看到值已更改。但是當我在我的Java應用程序中從運行時執行程序運行我的命令時,在Windows註冊表中沒有更改任何值,但我看到命令執行沒有問題。在我的Java調試中,我看到了與批處理文件中執行的命令完全相同的命令。
什麼可能是由我的Java應用程序內執行的reg.exe命令更改註冊表值的原因?
進程監視器畫面(由漁業部的前端之後):