Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 30.09.2017
Сообщений: 5

Программа как Fences (Прорисовка Иконок на рабочем столе)

16.12.2022, 23:06. Показов 1487. Ответов 0

Студворк — интернет-сервис помощи студентам
Я пытаюсь сделать аналог Fences или хотя бы частичный его функционал. Изначально хотел на C#, но поиски решения увели меня в C++ и WINApi. У меня уже есть код, который ищет позиции иконок на рабочем столе и он использует COM объекты.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
void run()
{
    CComPtr<IShellWindows> spShellWindows;
    CComPtr<IShellBrowser> spBrowser;
    CComPtr<IDispatch> spDispatch;
    CComPtr<IShellView> spShellView;
    CComPtr<IFolderView2>  spView;
    CComPtr<IShellFolder> spFolder;
    CComPtr<IEnumIDList>  spEnum;
    CComHeapPtr<ITEMID_CHILD> spidl;
    CComVariant vtLoc(CLSID_ShellWindows);
    CComVariant vtEmpty;
    STRRET str;
 
    setlocale(LC_ALL, "Russian");
    UINT a = 0;
    UINT b = 0;
    FOLDERSETTINGS LPFOLDERSETTINGS = { a, b };
 
    int count = 0;
    HRESULT hr;
    long lhWnd;
 
    hr = CoInitializeEx(NULL, COINITBASE_MULTITHREADED | COINIT_DISABLE_OLE1DDE);
 
    hr = spShellWindows.CoCreateInstance(CLSID_ShellWindows);
 
    hr = spShellWindows->FindWindowSW(&vtLoc, &vtEmpty, SWC_DESKTOP, &lhWnd, SWFO_NEEDDISPATCH, &spDispatch);
 
    CComQIPtr<IServiceProvider>(spDispatch)->QueryService(SID_STopLevelBrowser, IID_PPV_ARGS(&spBrowser));
 
    spBrowser->QueryActiveShellView(&spShellView);
 
    hr = spShellView->GetCurrentInfo(&LPFOLDERSETTINGS);
 
 
    spShellView->QueryInterface(IID_PPV_ARGS(&spView));
 
    hr = spView->GetFolder(IID_PPV_ARGS(&spFolder));
 
    spView->Items(SVGIO_ALLVIEW, IID_PPV_ARGS(&spEnum));
 
    for (; spEnum->Next(1, &spidl, nullptr) == S_OK; spidl.Free()) {
        // GET/PRINT ICON NAME AND POSITION
        wchar_t* name;
        POINT pt;
        spFolder->GetDisplayNameOf(spidl, SHGDN_NORMAL, &str);
        StrRetToStrW(&str, spidl, &name);
        spView->GetItemPosition(spidl, &pt);
        printf("%5d %5d \"%ls\"\n", pt.x, pt.y, name);
        count++;
    }
    fprintf(stderr, "enumerated %d desktop icons\n", count);
    spShellWindows.Release();
    spBrowser.Release();
    spDispatch.Release();
    spShellView.Release();
    spView.Release();
    spFolder.Release();
    spEnum.Release();
    spidl.Free();
 
    CoUninitialize();
}

Но даже если сделать мое приложение как виджет https://www.cyberforum.ru/blog... g4768.html, мне все равно понадобится изменение логики отрисовки иконок или рисовать их полностью самостоятельно (Как скорее всего и делает Fences)

А может быть еще попробую костыль: поместить иконки по координатам за экраном, принудительно отключить авто сортировку, что бы они не возвращались и делать новые уже внутри полей.

Может кто-нибудь направить к ответу и дать ссылку на информацию, вероятно это что-то из раздела хуков, но я не могу понять что конкретно и как их встроить в контексте COM объекта.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.12.2022, 23:06
Ответы с готовыми решениями:

Как определить координаты иконок на рабочем столе?
Как определить координаты иконок на рабочем столе? Спасибо.

Предпросмотр иконок на рабочем столе
Раньше, если на рабочий стол кинуть рисунок, можно его увидеть в &quot;иконке&quot;. или папку, в &quot;иконке папки&quot; можно увидеть файлы....

Неправильное отображение иконок на рабочем столе
Добрый день! Проблема в отображении иконок рабочего стола. Кажется, они отображаются в виде Таблицы. Проблема возникла после...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.12.2022, 23:06
Помогаю со студенческими работами здесь

Блокировка положения иконок на рабочем столе
Здравствуйте, у меня возникла проблема: Решил я иногда подключать мой телевизор к компьютеру, чтобы посмотреть фильмы или просто поиграть...

Сделать распределение иконок на рабочем столе
Подскажите, пожалуйста, как сделать такую группировку иконок на рабочем столе, как на скриншоте. Имею ввиду, что бы было название группы...

Кэширование (?) иконок на рабочем столе при загрузке
Решил обратиться к общественности за помощью в решении этой может быть и пустяковой проблемы, но за год она меня реально достала, а к её...

Создание иконок на рабочем столе при подключении флешки
Привет, ребята. Хотелось бы, что бы при подключении флешки, на рабочем столе сразу создавались иконки определенных программ или папок с...

Программы не запускаются на рабочем столе, ко всем ярлыкам на рабочем столе добавляется приставка .Ink
Помогите пожалуйста, использовал рекомендованную вами программу CureIT (нашел 18 вредоносных объектов) и вылечил, но проблема с рабочим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) / / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров) . . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru