2010-07-24 37 views
2

下面的代码调用SHGetSetSettings函数来隐藏桌面图标 ,但它只是从视图菜单中取消选中“显示桌面图标”。如何让“显示/隐藏桌面图标”设置生效?

我打电话给SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, nil, nil); 来更新桌面,但不起作用?

var 
lpss: SHELLSTATE; 
begin 
    lpss.Data := High(cardinal); 
    lpss.Data2 := Low(cardinal); 
    SHGetSetSettings(lpss,SSF_HIDEICONS,true); 
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, nil, nil); 
end; 

回答

1

ISA,刷新您可以发送F5键的progman(项目经理)的桌面窗口

PostMessage(FindWindow('Progman', nil), WM_KEYDOWN, VK_F5, 3); 

另一种选择隐藏桌面图标是

ShowWindow(FindWindow('Progman', nil),SW_HIDE); //hide the icons desktop and refresh the screen 

到再次出现

ShowWindow(FindWindow('Progman', nil),SW_SHOW); //show the icons of the desktop and refresh 
+0

隐藏'Progman'将禁用右键单击桌面上。 发送f5到桌面不起作用。 – isa 2010-07-24 19:31:57

+0

@isa,我已经尝试发送F5键,并为我工作。你用的是哪个版本的windows? – RRUZ 2010-07-24 19:38:27

+0

SHGetSetSettings(lpss,SSF_HIDEICONS,true);发送F5键刷新桌面作品,我的意思是它不会隐藏图标后 SHGetSetSettings(lpss,SSF_HIDEICONS,true); – isa 2010-07-25 08:34:48

-1

要隐藏或显示桌面图标:

Procedure DesktopIcons(Const Show : Boolean); 
Var 
    h : HWND; 
begin 
    h := GetWindow(FindWindow('Progman', 'Program Manager'), GW_CHILD); 
    If Show then ShowWindow(h, SW_SHOW) 
    else ShowWindow(h, SW_HIDE); 
end; 
+0

隐藏'Progman'将禁用在桌面上的右键单击 – isa 2010-07-25 19:03:37

0

不太一个答案,因为我不知道为什么SHGetSetSettings不起作用。但是,您可以执行shell执行的操作来隐藏图标;隐藏列表视图控制。

这是桌面的窗口结构;

'Program Manager' - Progman 
    '' - SHELLDLL_DefView 
    'FolderView' - SysListView32 

'SysListView32'是显示图标的'SysListView32'。


您可以测试并查看shell是否确实隐藏了列表视图;隐藏在视图菜单中的“显示桌面图标”项的图标,然后运行下面的,

function GetDesktopListView: HWnd; 
begin 
    Result := GetWindow(GetWindow(FindWindow('Progman', nil), GW_CHILD), GW_CHILD); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ShowWindow(GetDesktopListView, SW_SHOW); 
end; 

和图标会再次出现。

由于您可以通过使用'SHGetSetSettings'来检查/取消选中菜单项,图标的可见性将为 - 看似 - 按照。此外,您不需要刷新桌面,因为可见性更改会立即生效。

+0

良好的解决方法解决方案 – isa 2010-08-05 21:53:27

+0

由于此答案已作为* correct *方法的解决方法呈现,由于某种原因或其他方式无效,我想被告知有关反对票的原因。 – 2010-08-15 04:04:14

+0

嗨塞尔特克。这不是我的Win 7 32上的工作。 – Ampere 2014-01-30 09:29:12

0

嗯,你不觉得SHCNE_ASSOCCHANGED是一个错误的选择吗?

SHCNE_ASSOCCHANGED表示“文件关联已更改”。您没有更改任何文件关联。您已更改壳牌设置。看到不同?

尝试使用SHCNE_ALLEVENTS(我也尝试使用SHCNE_UPDATEDIR和SHCNE_UPDATEITEM与桌面)。