Добавление элементов и задач в Jump List приложения
Добавление элементов и задач в Jump List приложения
Функция "Jump List" - список быстрого перехода - впервые появилась в Windows 7. Она создана для облегчения поиска нужных опций и ускорения выполнения наиболее частых операций для выбранного приложения. Списки быстрого перехода появляются при нажатии правой кнопкой мыши на значке приложения в панели задач. Большинство функций для работы с панелью задач я уже давным-давно разобрал, а про Jump List совсем забыл. Срочно исправляю ситуацию.
Как и в случае с другими функциями панели задач, тут тоже используются COM-объекты. А для работы с ними придется, как обычно, предварительно описать огромную пачку структур, GUID'ов, интерфейсов и констант.
Code (Assembler) : Убрать нумерацию
- struct PROPVARIANT
- vt dw ?
- wReserved rw 3
- struct
- lVal dd ?
- ends
- decVal dd ?
- ends
- struct PROPKEY
- fmtid rb 16
- pid dd ?
- ends
- ; IID_ICustomDestinationList Interface
- struct ICustomDestinationList
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; ICustomDestinationList
- SetAppID dd ? ; 00Ch
- BeginList dd ? ; 010h
- AppendCategory dd ? ; 014h
- AppendKnownCategory dd ? ; 018h
- AddUserTasks dd ? ; 01Ch
- CommitList dd ? ; 020h
- GetRemovedDestinations dd ? ; 024h
- DeleteList dd ? ; 028h
- AbortList dd ? ; 02Ch
- ends
- ; IID_IObjectCollection Interface
- struct IObjectCollection
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IObjectCollection
- GetCount dd ? ; 00Ch
- GetAt dd ? ; 010h
- AddObject dd ? ; 014h
- AddFromArray dd ? ; 018h
- RemoveObjectAt dd ? ; 01Ch
- Clear dd ? ; 020h
- ends
- ; IID_IShellLinkW Interface
- struct IShellLinkW
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IShellLinkW
- GetPath dd ? ; 00Ch
- GetIDList dd ? ; 010h
- SetIDList dd ? ; 014h
- GetDescription dd ? ; 018h
- SetDescription dd ? ; 01Ch
- GetWorkingDirectory dd ? ; 020h
- SetWorkingDirectory dd ? ; 024h
- GetArguments dd ? ; 028h
- SetArguments dd ? ; 02Ch
- GetHotkey dd ? ; 030h
- SetHotkey dd ? ; 034h
- GetShowCmd dd ? ; 038h
- SetShowCmd dd ? ; 03Ch
- GetIconLocation dd ? ; 040h
- SetIconLocation dd ? ; 044h
- SetRelativePath dd ? ; 048h
- Resolve dd ? ; 04Ch
- SetPath dd ? ; 050h
- ends
- ; IID_IPropertyStore Interface
- struct IPropertyStore
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IPropertyStore
- GetCount dd ? ; 00Ch
- GetAt dd ? ; 010h
- GetValue dd ? ; 014h
- SetValue dd ? ; 018h
- Commit dd ? ; 01Ch
- ends
- ; GUID {77F10CF0-3DB5-4966-B520-B7C54FD35ED6}
- CLSID_DestinationList \
- dd 077F10CF0h
- dw 03DB5h
- dw 04966h
- db 0B5h, 020h, 0B7h, 0C5h, 04Fh, 0D3h, 05Eh, 0D6h
- ; GUID {6332DEBF-87B5-4670-90C0-5E57B408A49E}
- IID_ICustomDestinationList \
- dd 06332DEBFh
- dw 087B5h
- dw 04670h
- db 090h, 0C0h, 05Eh, 057h, 0B4h, 008h, 0A4h, 09Eh
- ; GUID {92CA9DCD-5622-4BBA-A805-5E9F541BD8C9}
- IID_IObjectArray \
- dd 092CA9DCDh
- dw 05622h
- dw 04BBAh
- db 0A8h, 005h, 05Eh, 09Fh, 054h, 01Bh, 0D8h, 0C9h
- ; GUID {2D3468C1-36A7-43B6-AC24-D3F02FD9607A}
- CLSID_EnumerableObjectCollection \
- dd 02D3468C1h
- dw 036A7h
- dw 043B6h
- db 0ACh, 024h, 0D3h, 0F0h, 02Fh, 0D9h, 060h, 07Ah
- ; GUID {5632B1A4-E38A-400A-928A-D4CD63230295}
- IID_IObjectCollection \
- dd 05632B1A4h
- dw 0E38Ah
- dw 0400Ah
- db 092h, 08Ah, 0D4h, 0CDh, 063h, 023h, 002h, 095h
- ; GUID {00021401-0000-0000-C000-000000000046}
- CLSID_ShellLink \
- dd 000021401h
- dw 00000h
- dw 00000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
- ; GUID {000214F9-0000-0000-C000-000000000046}
- IID_IShellLinkW \
- dd 0000214F9h
- dw 00000h
- dw 00000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
- ; GUID {886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99}
- IID_IPropertyStore \
- dd 0886D8EEBh
- dw 08CF2h
- dw 04446h
- db 08Dh, 002h, 0CDh, 0BAh, 01Dh, 0BDh, 0CFh, 099h
- ; GUID {9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}
- PKEY_AppUserModel_IsDestListSeparator \
- dd 09F4C2855h
- dw 09F79h
- dw 04B39h
- db 0A8h, 0D0h, 0E1h, 0D4h, 02Dh, 0E1h, 0D5h, 0F3h
- PKEY_AppUserModel_IsDestListSeparator_pid = 6
- ; GUID {F29F85E0-4FF9-1068-AB91-08002B27B3D9}
- PKEY_Title \
- dd 0F29F85E0h
- dw 04FF9h
- dw 01068h
- db 0ABh, 091h, 008h, 000h, 02Bh, 027h, 0B3h, 0D9h
- PKEY_Title_pid = 2
- CLSCTX_INPROC_SERVER = 1
- S_OK = 0
- VT_I4 = 3
- VT_LPWSTR = 31
Дальше уже знакомая вам работа с объектами. Создаем объект списка, создаем нужное количество категорий, внутри них создаем объекты-ссылки с описанием действий, которые должны выполняться. Затем собираем это все вместе и применяем к приложению. Категории могут быть пользовательские с произвольным названием, одна стандартная категория с задачами и пара системных категорий с автоматическим заполнением, в которых будут отображаться элементы "Частые" или "Последние". В виде кода это выглядит примерно так:
Code (Assembler) : Убрать нумерацию
- ; Установить идентификатор пользовательской модели приложения
- invoke SetCurrentProcessExplicitAppUserModelID,szAppID
- ; Создать объект
- invoke CoCreateInstance,CLSID_DestinationList,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_ICustomDestinationList,pDestList
- ; Связать с нашим приложением через идентификатор
- mov eax, [pDestList]
- mov eax, [eax]
- stdcall dword [eax+ICustomDestinationList.SetAppID],[pDestList],\
- szAppID
- ; Создать новый Jump List
- mov eax, [pDestList]
- mov eax, [eax]
- stdcall dword [eax+ICustomDestinationList.BeginList],[pDestList],\
- dMaxSlots,IID_IObjectArray,pItems
- ; Создать коллекцию
- invoke CoCreateInstance,CLSID_EnumerableObjectCollection,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_IObjectCollection,pObjColl
- ; Имя файла нашего приложения для извлечения иконок
- invoke GetModuleFileName,NULL,szExePath,MAX_PATH
- ; Добавить задачи в коллекцию задач
- stdcall AddTask,[pObjColl],szApp1,szDesc1,szTitle1,1
- stdcall AddTask,[pObjColl],szApp2,szDesc2,szTitle2,2
- stdcall AddSeparator,[pObjColl]
- stdcall AddTask,[pObjColl],szApp3,szDesc3,szTitle3,3
- ; Добавить коллекцию задач в Jump List
- mov eax, [pDestList]
- mov eax, [eax]
- stdcall dword [eax+ICustomDestinationList.AddUserTasks],[pDestList],\
- [pObjColl]
- ; Создать пользовательскую категорию
- invoke CoCreateInstance,CLSID_EnumerableObjectCollection,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_IObjectCollection,pCategory
- ; Добавить задачи в пользовательскую категорию
- stdcall AddTask,[pCategory],szApp4,szDesc4,szTitle4,4
- stdcall AddTask,[pCategory],szApp5,szDesc5,szTitle5,0
- ; Добавить пользовательскую категорию в Jump List
- mov eax, [pDestList]
- mov eax, [eax]
- stdcall dword [eax+ICustomDestinationList.AppendCategory],[pDestList],\
- szCategory,[pCategory]
- ; Применить изменения
- mov eax, [pDestList]
- mov eax, [eax]
- stdcall dword [eax+ICustomDestinationList.CommitList],[pDestList]
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------
- ; Добавить ссылку в категорию
- ;-------------------------------------------------
- proc AddTask dObj:DWORD,szApp:DWORD,szDesc:DWORD,szTitle:DWORD,dIcon:DWORD
- pusha
- ; Создать ссылку
- invoke CoCreateInstance,CLSID_ShellLink,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_IShellLinkW,pLink
- ; Путь к запускаемому приложению
- mov eax, [pLink]
- mov eax, [eax]
- stdcall dword [eax+IShellLinkW.SetPath],[pLink],\
- [szApp]
- ; Ссылка на файл с иконкой и ее номер в ресурсах
- mov eax, [pLink]
- mov eax, [eax]
- stdcall dword [eax+IShellLinkW.SetIconLocation],[pLink],\
- szExePath,[dIcon]
- ; Текст всплывающей подсказки
- mov eax, [pLink]
- mov eax, [eax]
- stdcall dword [eax+IShellLinkW.SetDescription],[pLink],\
- [szDesc]
- ; Заполнить название
- mov eax,[pLink]
- mov eax,[eax]
- stdcall dword [eax+IShellLinkW.QueryInterface],[pLink],\
- IID_IPropertyStore,pPropStore
- mov [pv.vt],VT_LPWSTR
- mov eax,[szTitle]
- mov [pv.lVal],eax
- mov edi,prop.fmtid
- mov esi,PKEY_Title
- movsd
- movsd
- movsd
- movsd
- mov [prop.pid],PKEY_Title_pid
- ; Установить значение
- mov eax,[pPropStore]
- mov eax,[eax]
- stdcall dword [eax+IPropertyStore.SetValue],[pPropStore],\
- prop,pv
- mov eax,[pPropStore]
- mov eax,[eax]
- stdcall dword [eax+IPropertyStore.Commit],[pPropStore]
- ; Добавить ссылку в коллекцию
- mov eax, [dObj]
- mov eax, [eax]
- stdcall dword [eax+IObjectCollection.AddObject],[dObj],\
- [pLink]
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------
- ; Добавить разделитель
- ;-------------------------------------------------
- proc AddSeparator dObj:DWORD
- pusha
- ; Создать ссылку
- invoke CoCreateInstance,CLSID_ShellLink,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_IShellLinkW,pLink
- mov eax,[pLink]
- mov eax,[eax]
- stdcall dword [eax+IShellLinkW.QueryInterface],[pLink],\
- IID_IPropertyStore,pPropStore
- mov [pv.vt],VT_BOOL
- mov [pv.lVal],VT_TRUE
- mov edi,prop.fmtid
- mov esi,PKEY_AppUserModel_IsDestListSeparator
- movsd
- movsd
- movsd
- movsd
- mov [prop.pid],PKEY_AppUserModel_IsDestListSeparator_pid
- mov eax,[pPropStore]
- mov eax,[eax]
- stdcall dword [eax+IPropertyStore.SetValue],[pPropStore],\
- prop,pv
- mov eax,[pPropStore]
- mov eax,[eax]
- stdcall dword [eax+IPropertyStore.Commit],[pPropStore]
- ; Добавить ссылку в коллекцию
- mov eax, [dObj]
- mov eax, [eax]
- stdcall dword [eax+IObjectCollection.AddObject],[dObj],\
- [pLink]
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ; Прибраться за собой
- mov eax, [pDestList]
- mov eax, [eax]
- stdcall dword [eax+ICustomDestinationList.Release],[pDestList]
Просмотров: 823 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария