Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
旧的Delphi隐藏/显示桌面图标方法在Windows 7 64位下不起作用_Delphi_Windows 7_Icons_Desktop - Fatal编程技术网

旧的Delphi隐藏/显示桌面图标方法在Windows 7 64位下不起作用

旧的Delphi隐藏/显示桌面图标方法在Windows 7 64位下不起作用,delphi,windows-7,icons,desktop,Delphi,Windows 7,Icons,Desktop,我有一个Delphi2010应用程序,它在XP fine下显示/隐藏桌面图标。然而,在我的Windows7测试环境下(恰好是64位),图标不会消失 以下是我正在使用的关键代码(用于隐藏): 我发现我可以设置注册表: [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced] "HideIcons"=dword:00000001 如果我重新启动windows(或杀死资源管理器并重新启动它),这也可

我有一个Delphi2010应用程序,它在XP fine下显示/隐藏桌面图标。然而,在我的Windows7测试环境下(恰好是64位),图标不会消失

以下是我正在使用的关键代码(用于隐藏):

我发现我可以设置注册表:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"HideIcons"=dword:00000001
如果我重新启动windows(或杀死资源管理器并重新启动它),这也可以正常工作,但是有没有办法让旧代码正常工作和/或告诉桌面使用新的注册表信息重新加载,而不必使用这种激进的方法


提前感谢。

使用“ProgMan”而不是“Program Manager”。
在Win7 32位中工作(此处没有我的64位可用)

使用。您感兴趣的是fHideIcons字段和相应的SSF\u隐藏标志

或者,您可以使用。

好的,下面是修改后的hackish方法(抱歉,Alexander!):

var
桌面句柄:HWND;
...
///////////////////////////////////////////////////////////////////////
//枚举窗口的回调函数
///////////////////////////////////////////////////////////////////////
函数MyGetWindow(句柄:HWND;未使用:longint):bool;stdcall;
变量
hChild:HWND;
开始
如果句柄为0,则
开始
hChild:=FindWindowEx(句柄,0,'SHELLDLL_devview',nil);
如果hChild为0,则
开始
hChild:=FindWindowEx(hChild,0,'SysListView32',nil);
如果hChild为0,则
开始
DeskHandle:=hChild;
结束;
结束;
结束;
结果:=真;
结束;
过程ShowDesktopIcons(常量显示:布尔值);
开始
DeskHandle:=0;
EnumWindows(@MyGetWindow,0);
如果DeskHandle为0,则
开始
如果演出的话
开始
ShowWindow(桌面手柄、SW_SHOW);
结束
其他的
开始
显示窗口(桌面手柄、开关隐藏);
结束;
结束;
结束;
问题的出现是因为“Progman”和SysListView32之间的父/子关系已从XP更改为Vista/Win7(这正是为什么不应该使用hack;-)。此外,在Win7(我的测试环境)下应用带有多张图片的主题会进一步改变这种关系。因此,新的例程将遍历所有窗口,直到找到一个窗口下设置了“SHELLDLL_deView”和“SysListView32”子窗口。然后返回全局变量DeskHandle中SysListView32的句柄。不优雅,不确定在将来的代码中工作,但在今天工作


如果有人可以使用SHGetSetSettings版本,那绝对是正确的方法,而不是这个垃圾。

这似乎是一个很好的方法,的确。@Alexander,如果你做了这项工作,你也可以回答我不是这一领域的专家-我只是在谷歌上快速搜索一下。那花了我一分钟的时间。我也用同样的方法发布了您指定问题的答案。顺便说一句,我真的不明白为什么在StackOverflow上,任何“RTFM”的答案都被否决了(即使它在谷歌搜索词上有链接)。通过谷歌搜索官方文档以获得批准的解决方案,你会得到比从答案中使用黑客(注册表读/写、窗口操作等)更好的结果。@Alexander-我没有投任何反对票,也没有看到对你的答案投反对票。但我明白了道理;如果RTFM答案实际上不起作用。。。我提到的问题不是我的,我想如果你真的使用了这种方法,你可以帮助这个家伙,没有冒犯的意思@亚历山大-是的,我有时也注意到反对票并不稀少。例如,我不明白弗朗索瓦的答案是否被否决,因为他没有回答如何隐藏桌面图标,他回答了一个特定的问题,即为什么某些代码不起作用;预计他不会提出替代方案。此外,他还故意提到他无法在64位上测试代码。嗯,也许我遗漏了什么…我注意到用Delphi 2009编译时对Windows 7 64位没有影响。Andreas,你是对的,它只在某些情况下有效。问题在于主题。我转到Windows7基本主题还有一个原因,代码运行正常。我将其归因于代码,而不是主题更改(oops!)。问题再次在于“Progman”窗口的位置。Win 7默认主题的结构如下所示:“->SysListView32->SHELLDLL_deView->Progman”,主题为:“->SysListView32->SHELLDLL_deView->WorkerW->WorkerW->Progman”,我试图将Delphi 2010代码组合在一起,以获得Progman,无论它嵌套的深度有多深(不同的主题可能会创建不同数量的WorkerW)(或其他类型)的Windows。如果有任何帮助,我将不胜感激,以便更正答案。上面修订的代码应适用于Win 7和具有多张图片的主题,以及其他XP to Win 7环境。请查看我的新问题:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"HideIcons"=dword:00000001
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;
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;