2014-06-12 1 views
0

사용자가 동일한 컴퓨터에서 여러 인스턴스를 실행할 수있는 C++ 및 Qt를 사용하여 응용 프로그램을 작성하고 있습니다. 응용 프로그램의 각 인스턴스에는 두 개에서 세 개의 창이 있습니다. 현재 응용 프로그램의 모든 인스턴스와 해당 창은 작업 표시 줄에 그룹화되어 있습니다 (맨 위 이미지). 각 프로세스가 작업 표시 줄에 자체 그룹을 갖기를 원합니다 (하단 이미지). 어떻게이 일을 성취 할 수 있습니까?작업 표시 줄에서 개별 프로세스 그룹 해제

enter image description here

답변

2

당신은 윈도우의 일부, 또는 프로세스의 특정에 대해 다른 응용 프로그램 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()); 
+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