Как закрепить программу в панели задач на Ассемблере
Как закрепить программу в панели задач на Ассемблере
В Windows 7 есть возможность закрепления часто используемых программ прямо на панели задач. Что-то типа панели быстрого запуска предыдущих версий Windows, только более ущербное. Некоторые инсталляторы автоматически закрепляют устанавливаемые ими программы на панели задач без подтверждения пользователя, и мне стало интересно, как это можно сделать программным путем. В качестве языка для реализации, естественно, был выбран Ассемблер, но тут используются стандартные WinAPI, так что можно без проблем переписать на любой другой язык программирования.
Кратко, для закрепления программы на панели задач используется функция ShellExecute с параметром taskbarpin и она же, но с параметром taskbarunpin для изъятия программы из панели задач. Сперва опишем все необходимые значения в сегменте данных:
Code (Assembler) : Убрать нумерацию
- section '.data' data readable writeable
- ; Команды для ShellExecute
- szPin db 'taskbarpin',0
- szUnpin db 'taskbarunpin',0
- ; Путь к ярлыку, который надо закрепить или удалить
- szLink db 'c:\Program Files\Microsoft Games\Solitaire\SolitaireMCE.lnk',0
Code (Assembler) : Убрать нумерацию
- ; Закрепить программу на панели задач
- invoke ShellExecute,NULL,szPin,szLink,NULL,NULL,0
- cmp eax,20h
- ja pinned_ok
- pinned_error:
- ; Ошибка закрепления программы на панели задач
- ...
- pinned_ok:
- ; Программа успешно закреплена на панели задач
- ...
Чтобы изъять программу из панели задач, надо точно также задействовать функцию ShellExecute, но только команда будет taskbarunpin. Остальные параметры и особенности такие же, как и при закреплении ярлыка.
Code (Assembler) : Убрать нумерацию
- ; Изъять программу из панели задач
- invoke ShellExecute,NULL,szUnpin,szLink,NULL,NULL,0
- cmp eax,20h
- ja unpinned_ok
- unpinned_error:
- ; Ошибка изъятия программы из панели задач
- ...
- unpinned_ok:
- ; Программа успешно изъята из панели задач
- ...
Code (Assembler) : Убрать нумерацию
- CLSCTX_INPROC_SERVER = 1
- S_OK = 0
- PLMC_EXPLORER = 4
- ; 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
- ; 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 ?
- AddRef dd ?
- Release dd ?
- ; IPinnedList
- EnumObjects dd ?
- Modify dd ?
- GetChangeCount dd ?
- IsPinnable dd ?
- Resolve dd ?
- IsPinned dd ?
- ends
- ; IID_IPinnedList2 Interface
- struct IPinnedList2
- ; IUnknown
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- ; IPinnedList2
- EnumObjects dd ?
- Modify dd ?
- GetChangeCount dd ?
- GetPinnableInfo dd ?
- IsPinnable dd ?
- Resolve dd ?
- IsPinned dd ?
- GetPinnedItem dd ?
- GetAppIDForPinnedItem dd ?
- ItemChangeNotify dd ?
- UpdateForRemovedItemsAsNecessary dd ?
- ends
- ; IID_IPinnedList3 Interface
- struct IPinnedList3
- ; IUnknown
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- ; IPinnedList3
- EnumObjects dd ?
- GetPinnableInfo dd ?
- IsPinnable dd ?
- Resolve dd ?
- LegacyModify dd ?
- GetChangeCount dd ?
- IsPinned dd ?
- GetPinnedItem dd ?
- GetAppIDForPinnedItem dd ?
- ItemChangeNotify dd ?
- UpdateForRemovedItemsAsNecessary dd ?
- PinShellLink dd ?
- GetPinnedItemForAppID dd ?
- Modify dd ?
- ends
- ; GUID {90AA3A4E-1CBA-4233-B8BB-535773D48449}
- CLSID_TaskbarPin dd 090AA3A4Eh
- dw 01CBAh
- dw 04233h
- db 0B8h, 0BBh, 053h, 057h, 073h, 0D4h, 084h, 049h
Code (Assembler) : Убрать нумерацию
- ; Инициализировать COM-объект
- invoke CoInitialize,NULL
- ; Попробовать создать объект (Win10 build 1809+)
- invoke CoCreateInstance,CLSID_TaskbarPin,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_IPinnedList3,ppv3
- cmp eax,S_OK
- jz @f
- ; Попробовать создать объект (Win7-8)
- invoke CoCreateInstance,CLSID_TaskbarPin,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_IPinnedList2,ppv2
- cmp eax,S_OK
- jz @f
- ; Попробовать создать объект (Vista)
- invoke CoCreateInstance,CLSID_TaskbarPin,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_IPinnedList,ppv1
- cmp eax,S_OK
- jnz loc_exit
- @@:
- invoke ILCreateFromPath,szLink
- mov [pEnum],eax
- loc_pin1:
- ; Windows Vista
- cmp [ppv1],0
- jz loc_pin2
- ; Приложение уже закреплено на панели задач?
- mov eax, [ppv1]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList.IsPinned],\
- [ppv1],[pEnum]
- cmp eax,S_OK
- jne @f
- ; Открепить приложение из панели задач
- mov eax, [ppv1]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList.Modify],\
- [ppv1],[pEnum],0
- jmp loc_done
- @@:
- ; Закрепить приложение на панели задач
- mov eax, [ppv1]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList.Modify],\
- [ppv1],0,[pEnum]
- jmp loc_done
- loc_pin2:
- ; Windows 7, 8, 8.1
- cmp [ppv2],0
- jz loc_pin3
- ; Приложение уже закреплено на панели задач?
- mov eax, [ppv2]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList2.IsPinned],\
- [ppv2],[pEnum]
- cmp eax,S_OK
- jne @f
- ; Открепить приложение из панели задач
- mov eax, [ppv2]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList2.Modify],\
- [ppv2],[pEnum],0
- jmp loc_done
- @@:
- ; Закрепить приложение на панели задач
- mov eax, [ppv2]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList2.Modify],\
- [ppv2],0,[pEnum]
- jmp loc_done
- loc_pin3:
- ; Windows 10
- cmp [ppv3],0
- jz loc_exit
- ; Приложение уже закреплено на панели задач?
- mov eax, [ppv3]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList3.IsPinned],\
- [ppv3],[pEnum]
- cmp eax,S_OK
- jne @f
- ; Открепить приложение из панели задач
- mov eax, [ppv3]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList3.Modify],\
- [ppv3],[pEnum],0,PLMC_EXPLORER
- jmp loc_done
- @@:
- ; Закрепить приложение на панели задач
- mov eax, [ppv3]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList3.Modify],\
- [ppv3],0,[pEnum],PLMC_EXPLORER
- loc_done:
- invoke ILFree,[pEnum]
- ; Освободить объекты
- cmp [ppv1],0
- jz @f
- mov eax, [ppv1]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList.Release],[ppv1]
- @@:
- cmp [ppv2],0
- jz @f
- mov eax, [ppv2]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList2.Release],[ppv2]
- @@:
- cmp [ppv3],0
- jz @f
- mov eax, [ppv3]
- mov eax, [eax]
- stdcall dword [eax+IPinnedList3.Release],[ppv3]
- @@:
- ; Удалить объект
- invoke CoUninitialize
Результат удаления ярлыка напрямую
В приложении примеры программ с исходными текстами, которые закрепляют ярлык стандартной игрушки Solitaire на панели задач, а затем изымают его оттуда.
Просмотров: 2736 | Комментариев: 9
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(10.04.2021 в 21:55):
Добавлен пример добавления и удаления ярлыков с помощью COM-объектов. Архив обновлен.
Владимир
(16.12.2016 в 21:01):
ManHunter, спасибо. Вроде работает.
ManHunter
(13.12.2016 в 21:16):
Владимир
(13.12.2016 в 18:25):
ManHunter, да, меня интересует такая программа, и, если можно, то с исходными текстами.
Кстати, на Windows 8.1 я пробовал копировать SCF-файл из Windows XP, который это делает. Он работает, но не закрепляется в "Панели задач".
Кстати, на Windows 8.1 я пробовал копировать SCF-файл из Windows XP, который это делает. Он работает, но не закрепляется в "Панели задач".
ManHunter
(12.12.2016 в 23:20):
У меня для этих целей написана специальная софтинка. Выложить?
Владимир
(12.12.2016 в 22:17):
Хотелось бы узнать как вернуть на "Панель задач" большую кнопку "Свернуть все окна" (точно такую же как в Windows XP).
В смысле я знаю много способов как свернуть окна, но хотелось бы именно как в Windows XP (то есть рядом с кнопкой "Пуск", а не в "Области уведомлений").
В смысле я знаю много способов как свернуть окна, но хотелось бы именно как в Windows XP (то есть рядом с кнопкой "Пуск", а не в "Области уведомлений").
ManHunter
(05.10.2016 в 16:06):
Да, ошибся в тексте. Поправил, спасибо!
anonymous
(05.10.2016 в 14:57):
"Результат выполнения не должен превышать 20h, это будет означать, что функция отработала успешно. Любое значение больше 20h считается ошибкой."
Наоборот, любое значение <= 20h считается ошибкой. Это видно даже из вашего кода.
cmp eax,20h
ja pinned_ok
cmp eax,20h
ja unpinned_ok
Наоборот, любое значение <= 20h считается ошибкой. Это видно даже из вашего кода.
cmp eax,20h
ja pinned_ok
cmp eax,20h
ja unpinned_ok
wetal
(19.09.2016 в 19:12):
На Win10 этот способ почему то выпилили из системы. С другой стороны, оно и верно. А то всякие говнопрограмы лезли без спросу на панель. Только юзер вправе решать, кому там быть.
Добавить комментарий
Заполните форму для добавления комментария