Blog. Just Blog

Получение списка программ, закрепленных на панели задач

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из старых статей о работе с панелью задач я написал, что узнать список закрепленных программ можно перебором ярлыков в папке %APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar. Действительно, это можно сделать и так, но лучше делать это правильно, с использованием предназначенных для этого COM-интерфейсов системы. Начнем с описания констант, GUID и интерфейсов, которые нам понадобятся для работы.
  1. CLSCTX_INPROC_SERVER    = 1
  2. S_OK                    = 0
  3.  
  4. ; Windows Vista
  5. ; GUID {C3C6EB6D-C837-4EAE-B172-5FEC52A2A4FD}
  6. IID_IPinnedList dd 0C3C6EB6Dh
  7.                 dw 0C837h
  8.                 dw 04EAEh
  9.                 db 0B1h, 072h, 05Fh, 0ECh, 052h, 0A2h, 0A4h, 0FDh
  10.  
  11. ; Windows 7, 8, 8.1
  12. ; GUID {BBD20037-BC0E-42F1-913F-E2936BB0EA0C}
  13. IID_IPinnedList2 dd 0BBD20037h
  14.                  dw 0BC0Eh
  15.                  dw 042F1h
  16.                  db 091h, 03Fh, 0E2h, 093h, 06Bh, 0B0h, 0EAh, 00Ch
  17.  
  18. ; Windows 10 build 1809+
  19. ; GUID {0DD79AE2-D156-45D4-9EEB-3B549769E940}
  20. IID_IPinnedList3 dd 00DD79AE2h
  21.                  dw 0D156h
  22.                  dw 045D4h
  23.                  db 09Eh, 0EBh, 03Bh, 054h, 097h, 069h, 0E9h, 040h
  24.  
  25. ; IID_IPinnedList Interface
  26. struct IPinnedList
  27.     ; IUnknown
  28.     QueryInterface dd ?   ; 000h
  29.     AddRef         dd ?   ; 004h
  30.     Release        dd ?   ; 008h
  31.     ; IPinnedList
  32.     EnumObjects    dd ?   ; 00Ch
  33.     Modify         dd ?   ; 010h
  34.     GetChangeCount dd ?   ; 014h
  35.     IsPinnable     dd ?   ; 018h
  36.     Resolve        dd ?   ; 01Ch
  37.     IsPinned       dd ?   ; 020h
  38. ends
  39.  
  40. ; GUID {90AA3A4E-1CBA-4233-B8BB-535773D48449}
  41. CLSID_TaskbarPin dd 090AA3A4Eh
  42.                  dw 01CBAh
  43.                  dw 04233h
  44.                  db 0B8h, 0BBh, 053h, 057h, 073h, 0D4h, 084h, 049h
  45.  
  46. ; IID_IEnumFullIDList Interface
  47. struct IEnumFullIDList
  48.     ; IUnknown
  49.     QueryInterface dd ?
  50.     AddRef         dd ?
  51.     Release        dd ?
  52.     ; IEnumFullIDList
  53.     Next           dd ?
  54.     Skip           dd ?
  55.     Reset          dd ?
  56.     Clone          dd ?
  57. ends
Как это ни странно, интерфейсы IPinnedList и их методы относятся к недокументированным и информации по ним в интернете практически нет. Для Windows 7-8 используется интерфейс IPinnedList2, а для Windows 10 сборки 1809 и выше нужен интерфейс IPinnedList3. Можно заморочиться даже для Windows Vista, там используется интерфейс IPinnedList. Для получения списка закрепленных приложений нам потребуется только один метод - EnumObjects, к счастью, во всех трех интерфейсах он совпадает.

С помощью этого метода получаем список идентификаторов элементов, то есть закрепленных программ. Перебирая по очереди каждый элемент, используя метод Next интерфейса IEnumFullIDList, получаем идентификатор каждого приложения. Затем при помощи функции SHGetPathFromIDList преобразуем идентификатор в человекопонятное название файла ярлыка.
  1.         ; Инициализировать COM-объект
  2.         invoke  CoInitialize,NULL
  3.  
  4.         ; Попробовать создать объект (Win10)
  5.         invoke  CoCreateInstance,CLSID_TaskbarPin,NULL,\
  6.                 CLSCTX_INPROC_SERVER,\
  7.                 IID_IPinnedList3,ppv
  8.         cmp     eax,S_OK
  9.         jz      @f
  10.  
  11.         ; Попробовать создать объект (Win7-8)
  12.         invoke  CoCreateInstance,CLSID_TaskbarPin,NULL,\
  13.                 CLSCTX_INPROC_SERVER,\
  14.                 IID_IPinnedList2,ppv
  15.         cmp     eax,S_OK
  16.         jz      @f
  17.  
  18.         ; Попробовать создать объект (Vista)
  19.         invoke  CoCreateInstance,CLSID_TaskbarPin,NULL,\
  20.                 CLSCTX_INPROC_SERVER,\
  21.                 IID_IPinnedList,ppv
  22.         cmp     eax,S_OK
  23.         jnz     wmclose
  24. @@:
  25.         ; Создать перечисление элементов
  26.         mov     eax, [ppv]
  27.         mov     eax, [eax]
  28.         stdcall dword [eax+IPinnedList.EnumObjects],[ppv],pEnum
  29. loc_next:
  30.         ; Получить следующий элемент списка
  31.         mov     eax, [pEnum]
  32.         mov     eax, [eax]
  33.         stdcall dword [eax+IEnumFullIDList.Next],\
  34.                 [pEnum],1,pidl,0
  35.         cmp     eax,S_OK
  36.         ; Элементов больше нет
  37.         jnz     loc_done
  38.  
  39.         ; Преобразовать идентификатор в путь к файлу
  40.         invoke  SHGetPathFromIDList,[pidl],buff
  41.  
  42.         ; buff -> строка с именем файла ярлыка
  43.         ...
  44.         ...
  45.  
  46.         ; Следующий элемент списка
  47.         jmp     loc_next
  48.  
  49. loc_done:
  50.         ; Освободить объекты
  51.         mov     eax, [pEnum]
  52.         mov     eax, [eax]
  53.         stdcall dword [eax+IPinnedList.Release],[pEnum]
  54.  
  55.         mov     eax, [ppv]
  56.         mov     eax, [eax]
  57.         stdcall dword [eax+IPinnedList.Release],[ppv]
  58.  
  59.         ; Удалить объект
  60.         invoke  CoUninitialize
В приложении пример программы с исходным текстом, которая выводит список ярлыков всех приложений, закрепленных в панели задач.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Enum.Pinned.Items.Demo.zip (3,513 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 979 | Комментариев: 0

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 2 (0.0079 сек.) / Память: 4.5 Mb
Наверх