旧的Delphi隐藏/显示桌面图标方法在Windows 7 64位下无法正常工作

时间:2010-08-14 05:54:27

标签: delphi windows-7 icons desktop

我有一个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(或者杀死资源管理器并重新启动它),这样可以正常工作,但是有没有办法让旧代码工作和/或告诉桌面使用新的注册表信息重新加载而没有这些激进的方法。

提前感谢。

3 个答案:

答案 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;