2014-06-12 1 views
0

Я пишу приложение с использованием C++ и Qt, которое может запускать несколько экземпляров на одном компьютере. Каждый экземпляр приложения имеет от двух до трех окон, связанных с ними. На данный момент все экземпляры приложения и их окна сгруппированы в панели задач (верхнее изображение). Я хочу, чтобы каждый процесс имел свою группу на панели задач (нижнее изображение). Как это можно достичь?Разгруппирование отдельных процессов с панели задач

enter image description here

ответ

2

Вы можете установить другой идентификатор приложения для некоторых из окон, или некоторые из процессов. Это то, что Windows использует для определения того, следует ли группировать значки или нет.

Пожалуйста, обратитесь к этой статье: http://msdn.microsoft.com/en-us/magazine/dd942846.aspx


Соответствующая цитата:

Установка идентификатора приложения для процесса включает в себя вызов функции Win32 SetCurrentProcessExplicitAppUserModelID из shell32.dll. Для установки идентификатора приложения для окна необходимо вызвать функцию SHGetPropertyStoreForWindow, а затем обработать возвращаемый объект IPropertyStore. В следующем примере показано, как это сделать:

PROPVARIANT pv; 
InitPropVariantFromString(L"MyAppID", &pv); 
IPropertyStore* pps; 
VERIFY(SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(&pps))); 
VERIFY(pps->SetValue(PKEY_AppUserModel_ID, pv)); 
VERIFY(pps->Commit()); 
+0

Ссылки могут ухудшиться. Вы должны включить подробные сведения о том, как сделать разгруппировку здесь в ответе. –

+0

Достаточно честный. Добавлена ​​цитата из статьи. – jwismar

+0

Это правильный путь. Используйте уникальный AppUserModeId. – Abhishek

1

Это решение будет разделять панель задач в соответствии с идентификатором processID. Недостатком является то, что пиннинг работает не очень хорошо.

OSVERSIONINFO v; 

v.dwOSVersionInfoSize= sizeof(OSVERSIONINFO); 
GetVersionEx(&v); 

if (v.dwMajorVersion == 6 && v.dwMinorVersion > 1 || v.dwMajorVersion > 6) 
{ 
    //on Windows 7 or higher ungroup taskbar for separate process 
    DWORD currentProcessId = GetCurrentProcessId(); 
    WCHAR AppID[100]; 
    swprintf(AppID, sizeof(AppID)/sizeof(AppID[0]), L"AppID%u", currentProcessId); 
    SetCurrentProcessExplicitAppUserModelID(AppID); 
} 
+0

Это должно работать во время запуска приложения, хотя нет? Как это не будет работать, как только окна покажут? – Noitidart