gpt4 book ai didi

delphi - 如何刷新注册表项而无需重新启动?

转载 作者:行者123 更新时间:2023-12-03 19:50:03 26 4
gpt4 key购买 nike

我使用以下代码来更改注册表中的区域数据。

procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
begin
reg:=TRegistry.Create;
try
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey('\Control Panel\International\',true);
reg.WriteString('iCountry','1');
reg.WriteString('iCurrDigits','2');
reg.WriteString('iCurrency','0');
reg.WriteString('iDate','1');
reg.WriteString('iDigits','2');
reg.WriteString('iLZero','0');
reg.WriteString('iMeasure','1');
reg.WriteString('iNegCurr','0');
reg.WriteString('iNegNumber','1');
reg.WriteString('iTimePrefix','0');
reg.WriteString('iTLZero','1');
reg.WriteString('Locale','00000409');
reg.WriteString('LocaleName','en-US');
reg.WriteString('sCountry','United States');
reg.WriteString('sDate','/');
reg.WriteString('sDecimal','.');
reg.WriteString('iNegCurr','0');
reg.WriteString('sShortDate','dd/MM/yyyy'); reg.CloseKey;
finally
reg.free;
end;
end;


但这需要重新启动计算机才能使更改生效。无需重新启动就能完成吗?

最佳答案

更改注册表后,通过将WM_SETTINGCHANGE设置为SendMessageTimeout()hWnd来广播系统范围内的HWND_BROADCAST消息:


更改系统参数后,应用程序应将WM_SETTINGCHANGE发送给所有顶级窗口。

...

wParam
...当系统由于区域设置更改而发送此消息时,此参数为零。

当应用程序发送此消息时,此参数必须为NULL。

...

帕拉姆
...当系统由于区域设置更改而发送此消息时,此参数指向字符串“ intl”。


例如:

procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
try
reg.RootKey := HKEY_CURRENT_USER;
reg.Access := KEY_SET_VALUE;
if reg.OpenKey('\Control Panel\International\', true) then
try
reg.WriteString('iCountry','1');
reg.WriteString('iCurrDigits','2');
reg.WriteString('iCurrency','0');
reg.WriteString('iDate','1');
reg.WriteString('iDigits','2');
reg.WriteString('iLZero','0');
reg.WriteString('iMeasure','1');
reg.WriteString('iNegCurr','0');
reg.WriteString('iNegNumber','1');
reg.WriteString('iTimePrefix','0');
reg.WriteString('iTLZero','1');
reg.WriteString('Locale','00000409');
reg.WriteString('LocaleName','en-US');
reg.WriteString('sCountry','United States');
reg.WriteString('sDate','/');
reg.WriteString('sDecimal','.');
reg.WriteString('iNegCurr','0');
reg.WriteString('sShortDate','dd/MM/yyyy');
finally
reg.CloseKey;
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM(PChar('intl')), SMTO_NORMAL, 100, PDWORD(nil)^);
end;
finally
reg.free;
end;
end;


而且在您问之前,可以这样在最后一个参数中使用 nil是安全的:

Passing nil to a variable parameter

在XE2之前,Delphi的 Windows单元将 SendMessageTimeout()的最后一个参数声明为:

var lpdwResult: DWORD


但是Win32 API将参数定义为:

_Out_opt_ PDWORD_PTR lpdwResult


这允许传入NULL指针。上面的 nil技巧是Delphi代码将NULL值传递给 var参数的唯一方法。编译器生成的机器代码将是正确的-它将仅将值0传递给该参数,而实际上不会尝试访问内存地址$ 00000000。

在XE2中,更改了 Windows单元以将最后一个参数声明为:

lpdwResult: PDWORD_PTR


匹配Win32 API定义。

因此,如果您将代码升级到XE2或更高版本,只需将 PDWORD(nil)^替换为 nil。或者,您可以现在就解决它,以后再不用担心:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM(PChar('intl')), SMTO_NORMAL, 100, {$IF RTLVersion >= 23}nil{$ELSE}PDWORD(nil)^{$IFEND});

关于delphi - 如何刷新注册表项而无需重新启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37404305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com