Как получить общее количество элементов на (логическом) рабочем столе (C #) - PullRequest
5 голосов
/ 15 сентября 2011

Позвольте мне уточнить. Под «элементами» я подразумеваю все элементы, которые вы видите на одном рабочем столе (Windows), включая «Мой компьютер», «Корзину», все ярлыки и т. Д. Если я выберу все элементы на рабочем столе, я получу счетчик в свойствах. отображается. Именно этот счет я хочу программно.

Проблема, с которой я сталкиваюсь:

На рабочем столе, как мы видим, есть элементы из моей учетной записи, а также элементы рабочего стола All Users, а также другие ярлыки, такие как «Мой компьютер», «Корзина». Всего 3 вещи. Поэтому я не могу просто получить количество элементов из физического пути к каталогу Desktop. Так что это не получается:

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

Я знаю, SpecialFolder.Desktop означает логический рабочий стол, как мы видим. Но это снова не удается, поскольку GetFolderPath() снова получает физический путь к рабочему столу пользователя:

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

Как правильно рассчитать общий счет на рабочем столе пользователя?

Ответы [ 3 ]

4 голосов
/ 15 сентября 2011

Оболочка Windows имеет полную и всестороннюю поддержку для этого.

  1. Позвоните SHGetDesktopFolder(), чтобы получить IShellFolder для рабочего стола.
  2. Позвоните IShellFolder::EnumObjects(), чтобы получить содержимое.

В этой статье Code Project приведены некоторые примеры использования с точки зрения C #.

0 голосов
/ 15 сентября 2011

Я отвечаю за себя ответ, который я наконец-то узнал с помощью советов и ссылок, размещенных здесь.

    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;
    }

Есть одна интересная (довольно раздражающая!) Вещь, которую я тем временем изучил. Рабочий стол, который вы видите на экране, отличается от вида папки на рабочем столе. Даже если вы снимите флажок «Мой компьютер» и «Мой документ» на рабочем столе (рабочий стол, который вы видите на мониторе), эти значки все еще могут присутствовать в представлении папок на рабочем столе. Я попробовал решение, приведенное в этой ссылке , но оно дает количество элементов, представленных в представлении папки. Решение, которое я разместил выше, даст идеальный результат, который я хочу. Решение было получено от здесь , Zhi-Xin Ye. Спасибо @ C.Evenhuis за подсказку.

0 голосов
/ 15 сентября 2011

Это просто невозможно, если вы этого хотите.

Вы, вероятно, забыли, что на любом рабочем столе есть элементы, которые не связаны с файлами (файлами или ссылками), а основаны на реестре, и вы определенно пропустите их.

...