Я пишу приложение с использованием C ++ и Qt, которое может запускать несколько экземпляров на одном компьютере. Каждый экземпляр приложения имеет два-три окна, связанные с ними. На данный момент все экземпляры приложения и их окна сгруппированы на панели задач (верхнее изображение). Я хочу, чтобы у каждого процесса была своя собственная группа на панели задач (нижнее изображение). Как этого достичь?
Вы можете установить другой идентификатор приложения для определенных окон или определенных процессов. Это то, что Windows использует, чтобы определить, следует ли группировать значки или нет.
Пожалуйста, смотрите эту статью: http://msdn.microsoft.com/en-us/magazine/dd942846.aspx
Уместная цитата:
Установка идентификатора приложения для процесса включает вызов SetCurrentProcessExplicitAppUserModelID
Функция Win32 из 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());
Это решение разделит панель задач в соответствии с идентификатором процесса. Недостатком является то, что пиннинг не работает хорошо.
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);
}