如何获得(逻辑)桌面(c#)上的项目总数

本文关键字:项目 桌面 何获得 逻辑 | 更新日期: 2023-09-27 18:08:33

让我来解释一下。我所说的"项目"是指你在桌面上看到的所有项目(Windows),包括"我的电脑"、"回收站"、所有快捷方式等。如果我选择桌面上的所有项目,我将在显示的属性中获得计数。我想要的就是这个计数。

我面临的问题:

我们看到的桌面有我的帐户项目,还有All Users的桌面项目和其他快捷键,如"我的电脑","回收站"。总的来说,有三件事。所以我不能从物理路径到Desktop目录中获取项目计数。所以这个失败了:

int count =
    Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder
                                                            .DesktopDirectory)
                      ).Length;

我知道SpecialFolder.Desktop代表逻辑桌面。但是这又失败了,因为GetFolderPath()再次获得用户桌面的物理路径:

int count = 
    Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder
                                                            .Desktop)
                      ).Length;

获取用户桌面总数的正确方法是什么?

如何获得(逻辑)桌面(c#)上的项目总数

Windows shell对此有充分和全面的支持。

  1. 呼叫SHGetDesktopFolder()获取桌面IShellFolder
  2. 呼叫IShellFolder::EnumObjects()获取内容

这篇代码项目文章从c#的角度给出了一些使用示例。

这在某种程度上是不可能的。

您可能忘记了在任何桌面上都有元素,这些元素与文件无关(文件或链接),而是基于注册表的,您肯定会错过它们。

我在这里的提示和链接的帮助下终于找到了答案。

    private const uint GET_ITEM_COUNT = 0x1000 + 4;

    [DllImport("user32.DLL")]
    private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
    [DllImport("user32.DLL")]
    private static extern IntPtr FindWindow(string lpszClass, string lpszWindow);
    [DllImport("user32.DLL")]
    private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, 
                                                            string lpszClass, string lpszWindow);

    public static int GetDesktopCount()
    {
        //Get the handle of the desktop listview
        IntPtr vHandle = FindWindow("Progman", "Program Manager");
        vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
        vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SysListView32", "FolderView");

        //Get total count of the icons on the desktop
        int vItemCount = SendMessage(vHandle, GET_ITEM_COUNT, 0, 0);
        return vItemCount;
    }

在此期间,我学到了一件有趣的(相当恼人的)事情。您在屏幕上看到的桌面与桌面的文件夹视图不同。即使你把"我的电脑"answers"我的文档"从桌面(你在显示器上看到的桌面)中取消勾选,这些图标仍然可以在桌面的文件夹视图中。我尝试了这个链接中给出的解决方案,但它给出了文件夹视图中存在的项目计数。我上面发布的解决方案将产生我想要的完美结果。叶志新从这里得到了解决方案。谢谢@C。