从任务栏取消分组单独的进程

时间:2014-06-12 23:34:34

标签: c++ windows qt taskbar

我正在使用C ++和Qt编写应用程序,用户可以在同一台机器上运行多个实例。应用程序的每个实例都有两到三个与之关联的窗口。目前,应用程序及其窗口的所有实例都在任务栏中组合在一起(顶部图像)。我希望每个进程在任务栏中都有自己的组(底部图像)。如何实现这一目标?

enter image description here

2 个答案:

答案 0 :(得分:3)

您可以为某些窗口或某些进程设置不同的应用程序ID。这是Windows用于确定是否对图标进行分组的方法。

请参阅此文章:http://msdn.microsoft.com/en-us/magazine/dd942846.aspx


相关报价:

设置进程的应用程序ID涉及从shell32.dll调用SetCurrentProcessExplicitAppUserModelID Win32函数。设置窗口的应用程序ID需要调用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());

答案 1 :(得分: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);
 }