如何重读注册表的一部分?(100分)

V

vmao

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中改了注册表文件的关联!
如把*.sql用notepad.exe打开!但是必须要重起电脑或注销一下图标才会刷新过来!
有什么办法不用注销?写什么语句?

windows本身就可以在改了关联后自动刷新的!
 
BroadcastSystemMessage(BSF_FLUSHDISK or BSF_QUERY, nil, WM_WININICHANGE, 0, 0);
 
BroadcastSystemMessage(BSF_FLUSHDISK or BSF_QUERY, nil, WM_WININICHANGE, 0, 0);
不行!没有更新过来!
 
刷新注册表,这个我也找了一下,都说可以用API直接做到,但好像还没有找到哪个具体说
了哪个API的,贴一篇别人写的给你吧,可能对你的没有用,但看你是否可以从中得到什么
启发吗.
全部在这儿了:
我自己摸索和一位网友的答案。
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST+SHCNF_FLUSH,nil,nil);//刷新文件关联图标
其中SHChangeNotify还有多个地方可以刷新(如文件删除,磁盘弹出等等),具体的看帮助!
SHChangeNotify(SHCNE_ALLEVENTS , SHCNF_FLUSH,nil,nil);//发生所有的事件,系统应该刷新响应的项目
function SHUpdateRecycleBinIcon():boolean;stdcall;external 'shell32.dll' name 'SHUpdateRecycleBinIcon';//刷新回收站图标
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);//通知系统设置改变
var
buf:pchar;
...
getmem(buf,SizeOfBuf);//
strpcopy(buf,'注册表的主键,例如Software/Microsoft/windows/currentversion/Explorer/ToolBar');
SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,buf);
//通知系统刷新响应的键值,如果前面的没有起作用,那么可以采用这个方法。
systemparametersinfo(SPI_SETDESKWALLPAPER,0,pchar(path),0);
//上面的是通知系统更改了墙纸,其中path为墙纸的路径。
同样,SystemParametersInfo()还可以对系统进行很多方面的刷新,例如更改了桌面的大小等等,你可以看看帮助,我不可能在这儿把所有的都写出来。

要做到象Tweak UI那样Rebuild ICON,可以采用下面的方法:
:delphifan
这个问题确实很有意思,害得我找了很久,请看答案:

Reg := TRegistry.Create;
try
//设置图标
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('/Software/Microsoft/Windows/CurrentVersion/explorer/Shell Icons',True) then
Reg.WriteString('3','C:/WINDOWS/SYSTEM/shell32.dll,15');
//修改icon size
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('/Control Panel/Desktop/WindowMetrics', True)
then Reg.WriteString('Shell Icon Size','31');
//通知windows
SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
//当然别忘了改回来
Reg.WriteString('Shell Icon Size','32');
SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
finally
Reg.CloseKey;
Reg.Free;
end;

关键是强迫windows重新刷新 icon cache,通过修改icon大小是一种可行的办法,
--------------------------------------------------------------------
 
接受答案了.
 
顶部