我有一个Delphi 2010应用程序,可以在XP下显示/隐藏桌面图标。但是在我的Window 7测试环境下(恰好是64位),图标不会消失。
这是我正在使用的关键代码(用于隐藏):
ShowWindow(FindWindow(nil, 'Program Manager'), SW_HIDE );
我发现我可以设置注册表:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"HideIcons"=dword:00000001
如果我重新启动Windows(或者杀死资源管理器并重新启动它),这样可以正常工作,但是有没有办法让旧代码工作和/或告诉桌面使用新的注册表信息重新加载而没有这些激进的方法。
提前感谢。
答案 0 :(得分:4)
使用SHGetSetSettings function。您对 fHideIcons 字段和相应的 SSF_HIDEICONS 标记感兴趣。
或者,您可以使用corresponding group policy。
答案 1 :(得分:2)
好的,这是修订的 hackish方法(对不起亚历山大!):
var
DeskHandle : HWND;
...
///////////////////////////////////////////////////////////////////////
// Callback function for EnumWindows
///////////////////////////////////////////////////////////////////////
function MyGetWindow (Handle: HWND; NotUsed: longint): bool; stdcall;
var
hChild : HWND;
begin
if handle <> 0 then
begin
hChild := FindWindowEx(handle, 0, 'SHELLDLL_DefView' ,nil);
if hChild <> 0 then
begin
hChild := FindWindowEx(hChild, 0, 'SysListView32' ,nil);
if hChild <> 0 then
begin
DeskHandle := hChild;
end;
end;
end;
result := TRUE;
end;
procedure ShowDesktopIcons(const Show : boolean) ;
begin
DeskHandle := 0;
EnumWindows(@MyGetWindow, 0);
if DeskHandle <> 0 then
begin
if Show then
begin
ShowWindow(DeskHandle, SW_SHOW );
end
else
begin
ShowWindow(DeskHandle, SW_HIDE );
end;
end;
end;
问题出现是因为“Progman”和SysListView32之间的父/子关系已经从XP变为Vista / Win7(正是为什么你不应该使用hack ;-)。此外,在Win7(我的测试环境)下应用具有多个图片的主题会进一步改变这种关系。因此,新例程会查看所有窗口,直到找到一个在其中设置了“SHELLDLL_DefView”和“SysListView32”子项的窗口。然后它在全局变量DeskHandle中返回SysListView32的句柄。不优雅,不确定在未来的代码中工作,但今天工作。
如果任何人都可以使用SHGetSetSettings版本,这绝对是正确的方法,而不是这个垃圾。
答案 2 :(得分:0)
使用'ProgMan'而不是'Program Manager' 在Win 7 32位中工作(这里没有我的64位)。
procedure ShowDesktopIcons(const Visible: Boolean);
var
h: THandle;
begin
h := FindWindow('ProgMan', nil);
if h = 0 then
RaiseLastOSError;
if Visible then
ShowWindow(h, SW_SHOW)
else
ShowWindow(h, SW_HIDE);
end;
procedure TForm1.btnHideClick(Sender: TObject);
begin
ShowDesktopIcons(False);
end;
procedure TForm1.btnShowClick(Sender: TObject);
begin
ShowDesktopIcons(True);
end;