【问题标题】:How do I make the "show/hide desktop icons" setting take effect?如何使“显示/隐藏桌面图标”设置生效?
【发布时间】:2010-07-24 17:20:25
【问题描述】:

下面的代码调用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;

【问题讨论】:

    标签: delphi winapi shell


    【解决方案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
    

    【讨论】:

    • 隐藏“Progman”将禁用桌面上的右键单击。将 f5 发送到桌面也不起作用。
    • @isa,我已经尝试发送 F5 键并且对我来说工作正常。您使用的是哪个版本的 Windows?
    • 发送 F5 键刷新桌面工作,我的意思是在调用 SHGetSetSettings(lpss,SSF_HIDEICONS,true); 后它不会隐藏图标;
    【解决方案2】:

    不是一个完整的答案,因为我不知道为什么 SHGetSetSettings 不起作用。但是,您可以执行 shell 隐藏图标的操作;隐藏 List-View 控件。

    这是桌面的窗口层次结构;

    'Program Manager' - Progman
      '' - SHELLDLL_DefView
        'FolderView' - 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”来选中/取消选中菜单项,因此图标的可见性将是 -看似- 符合。此外,您无需刷新桌面,因为可见性更改会立即生效。

    【讨论】:

    • 由于此答案已作为 正确 方法的解决方法提出,由于某种原因或其他原因不起作用,我想被告知原因否决票。
    • @Altar - 也许你的背景图片旋转处于活动状态,我不知道它的名字 - 那是你的背景图片在指定时间段后发生变化。如果是这种情况,post 可能会有所帮助。
    【解决方案3】:

    嗯,你不认为 SHCNE_ASSOCCHANGED 是一个错误的选择吗?

    SHCNE_ASSOCCHANGED 表示“文件关联已更改”。您没有更改任何文件关联。您已更改 Shell 设置。看出区别了吗?

    改用 SHCNE_ALLEVENTS(我也会在桌面上尝试 SHCNE_UPDATEDIR 和 SHCNE_UPDATEITEM)。

    【讨论】:

      【解决方案4】:

      你试过广播WM_SETTINGCHANGE message吗?

      【讨论】:

      • 是的。它没有效果。
      【解决方案5】:

      隐藏或显示桌面图标:

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-17
        • 2019-01-24
        • 1970-01-01
        相关资源
        最近更新 更多