2010-08-14 71 views
2

我有一个Delphi 2010应用程序显示/隐藏XP下的桌面图标罚款。然而,在我的Window 7测试环境下(恰好是64位),图标不会消失。旧Delphi隐藏/显示桌面图标方法不工作在Windows 7 64位

这里是我使用(用于隐藏)关键代码:

ShowWindow(FindWindow(nil, 'Program Manager'), SW_HIDE); 

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

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced] 
"HideIcons"=dword:00000001 

如果我重新启动窗口(即正常工作或杀死资源管理器并重新启动它),但是有没有办法让旧代码工作和/或告诉桌面重新加载使用新的注册表信息,而没有这种激进的方法。

提前致谢。

+0

请看看我的新问题:http://stackoverflow.com/questions/3484860/implementing-shgetsetsettings-in-delphi – 2010-08-14 19:45:33

回答

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; 

问题的出现是因为 “普罗格曼” 和SysListView32之间的父/子关系已经从XP变更为VISTA/Win7的(正是为什么你不应该使用黑客;-)。另外,在Win7下(我的测试环境)应用一个包含多个图片的主题可以进一步改变这种关系。因此,新例程将查看所有窗口,直到找到一个具有“SHELLDLL_DefView”和“SysListView32”子集的项目为止。然后它返回全局变量DeskHandle中SysListView32的句柄。不优雅,不确定在未来的代码中工作,但今天起作用。

如果任何人都可以获得SHGetSetSettings版本的工作,那绝对是正确的方法,而不是这个垃圾。

+0

我注意到,当与德尔福2009年编译的Windows 7 64位没有影响。 – 2010-08-14 18:29:20

+0

安德烈亚斯,你是正确的,它只适用于某些情况。问题在于主题。我出于另一个原因去了Windows 7 Basic主题,并且代码正常工作。我将其归因于代码,而不是主题更改(哎呀!)。 – lgallion 2010-08-14 18:43:55

+1

问题再次是“Progman”窗口的位置。随着Win 7的默认主题的结构如下: “ - > SysListView32 - > SHELLDLL_DEFView - >普罗格曼” 一个主题: “ - > SysLIstView32 - > SHELLDLL_DefView - > WorkerW - > WorkerW - > Progman“ 我想把德尔福2010年的代码放到一起,无论它嵌套得多深(不同的主题可能会创建不同数量的WorkerW(或其他类型)的Windows在堆栈。任何帮助将 – lgallion 2010-08-14 19:42:11

0

使用'ProgMan'而不是'程序管理器'。
在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; 
+1

这不适用于Windows 7 64位。 – 2010-08-14 11:55:12

+1

不要使用黑客 – Alex 2010-08-14 12:46:42

+0

@亚历克斯 - 仍然每个人都使用他们aaaaaaall时间.... :) – Ampere 2016-04-19 11:37:01

4

使用SHGetSetSettings function。您有兴趣fHideIcons字段和相应的SSF_HIDEICONS标志。

或者,您可以使用corresponding group policy

+0

这似乎是很好的方式来做到这一点,的确如此。 – 2010-08-14 12:54:05

+0

@亚历山大,如果你已经做了这个工作,你也可以回答http://stackoverflow.com/questions/3326062/how-do-i-make-the-show-hide-desktop-icons-setting-take-effect – 2010-08-14 12:59:42

+0

我**不是**这个领域的专家 - 我只是做一个快速的谷歌搜索。 *这花了我1分钟的时间*。我也发布了针对您指定问题的答案 - 采用相同的方法。附: Seriosly,我不明白为什么任何“RTFM”的答案在这里StackOverflow(即使它在谷歌搜索词上有链接)被低估了。通过Google官方文档搜索获得批准的解决方案,您会获得** MUCH **更好的结果,而不是使用来自答案的黑客(注册表读/写,窗口操纵等)。 – Alex 2010-08-14 13:11:49