Получение списка программ, закрепленных на панели задач
В одной из старых статей о работе с панелью задач я написал, что узнать список закрепленных программ можно перебором ярлыков в папке %APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar. Действительно, это можно сделать и так, но лучше делать это правильно, с использованием предназначенных для этого COM-интерфейсов системы. Начнем с описания констант, GUID и интерфейсов, которые нам понадобятся для работы.Code (Assembler) : Убрать нумерацию
- CLSCTX_INPROC_SERVER = 1
- S_OK = 0
- ; Windows Vista
- ; GUID {C3C6EB6D-C837-4EAE-B172-5FEC52A2A4FD}
- IID_IPinnedList dd 0C3C6EB6Dh
- dw 0C837h
- dw 04EAEh
- db 0B1h, 072h, 05Fh, 0ECh, 052h, 0A2h, 0A4h, 0FDh
- ; Windows 7, 8, 8.1
- ; GUID {BBD20037-BC0E-42F1-913F-E2936BB0EA0C}
- IID_IPinnedList2 dd 0BBD20037h
- dw 0BC0Eh
- dw 042F1h
- db 091h, 03Fh, 0E2h, 093h, 06Bh, 0B0h, 0EAh, 00Ch
- ; Windows 10 build 1809+
- ; GUID {0DD79AE2-D156-45D4-9EEB-3B549769E940}
- IID_IPinnedList3 dd 00DD79AE2h
- dw 0D156h
- dw 045D4h
- db 09Eh, 0EBh, 03Bh, 054h, 097h, 069h, 0E9h, 040h
- ; IID_IPinnedList Interface
- struct IPinnedList
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IPinnedList
- EnumObjects dd ? ; 00Ch
- Modify dd ? ; 010h
- GetChangeCount dd ? ; 014h
- IsPinnable dd ? ; 018h
- Resolve dd ? ; 01Ch
- IsPinned dd ? ; 020h
- ends
- ; GUID {90AA3A4E-1CBA-4233-B8BB-535773D48449}
- CLSID_TaskbarPin dd 090AA3A4Eh
- dw 01CBAh
- dw 04233h
- db 0B8h, 0BBh, 053h, 057h, 073h, 0D4h, 084h, 049h
- ; IID_IEnumFullIDList Interface
- struct IEnumFullIDList
- ; IUnknown
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- ; IEnumFullIDList
- Next dd ?
- Skip dd ?
- Reset dd ?
- Clone dd ?
- ends
С помощью этого метода получаем список идентификаторов элементов, то есть закрепленных программ. Перебирая по очереди каждый элемент, используя метод Next интерфейса IEnumFullIDList, получаем идентификатор каждого приложения. Затем при помощи функции SHGetPathFromIDList преобразуем идентификатор в человекопонятное название файла ярлыка.
Code (Assembler) : Убрать нумерацию
- ; Инициализировать COM-объект
- invoke CoInitialize,NULL
- ; Попробовать создать объект (Win10)
- invoke CoCreateInstance,CLSID_TaskbarPin,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_IPinnedList3,ppv
- cmp eax,S_OK
- jz @f
- ; Попробовать создать объект (Win7-8)
- invoke CoCreateInstance,CLSID_TaskbarPin,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_IPinnedList2,ppv
- cmp eax,S_OK
- jz @f
- ; Попробовать создать объект (Vista)
- invoke CoCreateInstance,CLSID_TaskbarPin,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_IPinnedList,ppv
- cmp eax,S_OK
- jnz wmclose
- @@:
- ; Создать перечисление элементов
- mov eax, [ppv]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList.EnumObjects],[ppv],pEnum
- loc_next:
- ; Получить следующий элемент списка
- mov eax, [pEnum]
- mov eax, [eax]
- stdcall dword [eax+IEnumFullIDList.Next],\
- [pEnum],1,pidl,0
- cmp eax,S_OK
- ; Элементов больше нет
- jnz loc_done
- ; Преобразовать идентификатор в путь к файлу
- invoke SHGetPathFromIDList,[pidl],buff
- ; buff -> строка с именем файла ярлыка
- ...
- ...
- ; Следующий элемент списка
- jmp loc_next
- loc_done:
- ; Освободить объекты
- mov eax, [pEnum]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList.Release],[pEnum]
- mov eax, [ppv]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList.Release],[ppv]
- ; Удалить объект
- invoke CoUninitialize
Просмотров: 1033 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария