Тема: AHK: Группировка в панели задач
Нужно чтобы было так но только для определённых приложений.
То есть все группируются, а указанные нет.
Забыл добавить, что видел такую настройку у некоторых приложений.
Win10x64 AhkSpy, Hotkey, ClockGui
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Нужно чтобы было так но только для определённых приложений.
То есть все группируются, а указанные нет.
Забыл добавить, что видел такую настройку у некоторых приложений.
В смысле другое название процесса?
Стили окна?
Давай на примере своего приложения.
How do I customize how my application windows are grouped in the Taskbar?
Нужно задать другой Application User Model IDs (AppUserModelIDs) для нового окна. Для этого вам понадобится вызвать SHGetPropertyStoreForWindow.
Спасибо, не пробовал, в итоге в своём "как то" можно, в чужом, нет?
В своём можно просто (хоть в принципе и неправильно так ее применять, но вроде работает):
DllCall("Shell32.dll\SetCurrentProcessExplicitAppUserModelID", Str, "test")
gui, show
DllCall("Shell32.dll\SetCurrentProcessExplicitAppUserModelID", Str, "test1")
gui, 2: show
В чужом же наверняка придётся инжектить в процесс.
PS Тут, Lexikos приводит пример по SHGetPropertyStoreForWindow:
https://autohotkey.com/board/topic/7649 … ts-method/
PS Тут, Lexikos приводит пример по SHGetPropertyStoreForWindow:
Появляется новая кнопка в панели, это можно как то использовать?
Не понял вопроса.
Использовать для решения задачи.
То есть тебя интересует как повторить этот код через SHGetPropertyStoreForWindow?
DllCall("Shell32.dll\SetCurrentProcessExplicitAppUserModelID", Str, "test")
gui, show
DllCall("Shell32.dll\SetCurrentProcessExplicitAppUserModelID", Str, "test1")
gui, 2: show
Разобрался, спасибо за наводку. Единственный минус заметил, меню кнопки становится стандартным.
Получилось это (на примере с блокнотом):
DllCall("RegisterShellHookWindow", "Ptr", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "Str", "SHELLHOOK"), "ShellProc")
return
ShellProc(nCode, wParam) {
Static HSHELL_WINDOWCREATED := 1
If (nCode = HSHELL_WINDOWCREATED)
{
WinGet, Process, ProcessName, ahk_id %wParam%
If Process = notepad.exe
{
WinGet, List_id, List, ahk_class Notepad
If List_id > 1
NewAppid(wParam)
}
}
}
NewAppid(hwnd) {
Appid := A_ScriptHwnd A_TickCount
VarSetCapacity(IID_IPropertyStore, 16)
DllCall("ole32.dll\CLSIDFromString", "wstr", "{886d8eeb-8cf2-4446-8d02-cdba1dbdcf99}", "ptr", &IID_IPropertyStore)
VarSetCapacity(PKEY_AppUserModel_ID, 20)
DllCall("ole32.dll\CLSIDFromString", "wstr", "{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}", "ptr", &PKEY_AppUserModel_ID)
NumPut(5, PKEY_AppUserModel_ID, 16, "int")
DllCall("shell32.dll\SHGetPropertyStoreForWindow", "ptr", hwnd
, "ptr", &IID_IPropertyStore, "ptrp", pstore)
VarSetCapacity(variant, 8+2*A_PtrSize, 0)
NumPut(31, variant, 0, "short") ; VT_LPWSTR
NumPut(&Appid, variant, 8)
DllCall(NumGet(NumGet(pstore+0)+6*A_PtrSize), "ptr", pstore, "ptr", &PKEY_AppUserModel_ID, "ptr", &variant)
}
Также по MButton, на созданных кнопках, не появляются новые окна.
Наверное надо ещё добавить:
; MSDN: "A window's properties must be removed before the window is closed.
; If this is not done, the resources used by those properties are not
; returned to the system."
VarSetCapacity(variant, 8+2*A_PtrSize, 0)
IPropertyStore_SetValue(pstore, &PKEY_AppUserModel_ID, &variant)
Это не тоже самое?
DllCall(NumGet(NumGet(pstore+0)+6*A_PtrSize), "ptr", pstore, "ptr", &PKEY_AppUserModel_ID, "ptr", &variant)
Тоже самое. Но нужно еще раз вызывать перед закрытием окна.
Это что то даёт? В смысле по хорошему - да, но мне кажется можно забить на это.
Вот мне тоже интересно, чем это может обернуться.
Может утечкой какой-либо?
Так а что надо сделать, вернуть оригинальный PKEY_AppUserModel_ID, и как отследить закрытие процесса, в смысле с чем работать если ни окна ни процесса уже не будет.
Можно отлавливать HSHELL_WINDOWDESTROYED и проводить необходиую зачистку.
HSHELL_WINDOWDESTROYED , это понятно, я про то, что будет чистится если процесса уже нет? К чему обращается эта строчка?
DllCall(NumGet(NumGet(pstore+0)+6*A_PtrSize), "ptr", pstore, "ptr", &PKEY_AppUserModel_ID, "ptr", &variant)
HSHELL_WINDOWDESTROYED
A top-level, unowned window is about to be destroyed. The window still exists when the system calls this hook.
https://msdn.microsoft.com/en-us/librar … s.85).aspx
Ну может и успеет, если в другом потоке не будет Critical. Так к чему обращаются в DllCall, вместо имени Dll, эти загадочные адреса?.
К структуре struct IPropertyStoreVtbl:
typedef struct IPropertyStoreVtbl
{
BEGIN_INTERFACE
HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
IPropertyStore * This,
/* [in] */ __RPC__in REFIID riid,
/* [iid_is][out] */
__RPC__deref_out void **ppvObject);
ULONG ( STDMETHODCALLTYPE *AddRef )(
IPropertyStore * This);
ULONG ( STDMETHODCALLTYPE *Release )(
IPropertyStore * This);
HRESULT ( STDMETHODCALLTYPE *GetCount )(
IPropertyStore * This,
/* [out] */ __RPC__out DWORD *cProps);
HRESULT ( STDMETHODCALLTYPE *GetAt )(
IPropertyStore * This,
/* [in] */ DWORD iProp,
/* [out] */ __RPC__out PROPERTYKEY *pkey);
HRESULT ( STDMETHODCALLTYPE *GetValue )(
IPropertyStore * This,
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__out PROPVARIANT *pv);
HRESULT ( STDMETHODCALLTYPE *SetValue )(
IPropertyStore * This,
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ __RPC__in REFPROPVARIANT propvar);
HRESULT ( STDMETHODCALLTYPE *Commit )(
IPropertyStore * This);
END_INTERFACE
} IPropertyStoreVtbl;
IPropertyStoreVtbl вообще для меня загадка, как надо понимать что именно она требовалась для этой задачи. Чё то я плохо ищу на MSDN.
Просто у ком объектов такая структура.
https://blogs.msdn.microsoft.com/oldnew … 0/?p=40733
Я привык что у ком объекта есть свои методы, и получаем его ч помощью ComObj***. Это ком объект без интерфейса?
Управлять напрямую мы можем только теми объектами, которые поддерживают IDispatch интерфейс.
Вот тут можно почитать про com:
http://www.ironahot.idknet.com/asm/dispatch.htm
Спасибо.
Интересно, а в трее тоже самое можно провернуть?
Надоело что нельзя перетащить одну иконку скрипта, потому как они к одному экзешнику привязаны.
Ещё вопросик возник, как отменить данный метод, сгруппировать обратно.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться