2015-07-13 39 views
4

我正在研究一個應用程序,該應用程序在啓動時使用組合鍵創建新桌面,我可以在原始桌面和新桌面之間來回移動。在創建時,在新桌面上啓動一個新的explorer.exe進程,因此用戶可以啓動他所需的任何應用程序。獲取在特定桌面中打開的所有進程

當檢測到發送退出命令的組合鍵時,新桌面關閉,我們返回原來的桌面,但用戶在新桌面中啓動的所有應用程序仍在運行。

有沒有一種方法來處理在新桌面中打開的所有這些進程,對於Window Station有一個HANDLE和一個HDESK處理新桌面?

+1

進程可以在不同的桌面上創建窗口。一般來說,你所要求的是沒有明確定義的。 –

+0

OOC這是用於Windows 10中的新任務視圖的東西,還是您的意思是在任何版本的Windows中分開的桌面? –

+0

@JeffS我目前正在Windows 7中開發這個應用程序,所以我想看看我是否可以關閉在Windows 7下啓動的每個應用程序,在Windows 7 – Abo

回答

0

感謝David Heffernan的想法,我找到了以下解決方案。有一個用於桌面的HDESK句柄,我使用GetThreadDesktop函數將它與系統中的每個線程進行比較。我不確定它是最高性能的解決方案,我願意提供改進建議,但是這樣做很好:

int main(void) 
{ 
    // Desktop handles 
    HDESK currentDesktop = GetsecondDesktop(GetCurrentThreadId()); 
    HDESK secondDesktop = CreateDesktop(L"secondDesktop", NULL, NULL, 0, GENERIC_ALL, NULL); 

    // Start processes in secondDesktop ... 

    // Process enumeration 
    DWORD aProcesses[1024], cbNeeded, cProcesses; 
    unsigned int i; 
    EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded); 
    cProcesses = cbNeeded/sizeof(DWORD); 

    for (i = 0; i < cProcesses; i++) 
    { 
     if (aProcesses[i] != 0) 
     { 
      DWORD pThreadId = ListProcessThreads(aProcesses[i]); 
      if (GetsecondDesktop(pThreadId) == secondDesktop) 
      { 
       TerminateProcess(aProcesses[i]); 
      } 
     } 
    } 

    return 0; 
} 

DWORD ListProcessThreads(DWORD dwOwnerPID) 
{ 
    HANDLE hThreadSnap = INVALID_HANDLE_VALUE; 
    THREADENTRY32 te32; 

    // Take a snapshot of all running threads 
    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); 
    if (hThreadSnap == INVALID_HANDLE_VALUE) 
     return(FALSE); 

    // Fill in the size of the structure before using it. 
    te32.dwSize = sizeof(THREADENTRY32); 

    // Retrieve information about the first thread, 
    // and exit if unsuccessful 
    if (!Thread32First(hThreadSnap, &te32)) 
    { 
     CloseHandle(hThreadSnap);  // Must clean up the snapshot object! 
     return(FALSE); 
    } 

    // Now walk the thread list of the system, 
    // and display information about each thread 
    // associated with the specified process 
    do 
    { 
     if (te32.th32OwnerProcessID == dwOwnerPID) 
     { 
      return te32.th32ThreadID; 
     } 
    } while (Thread32Next(hThreadSnap, &te32)); 

    // Don't forget to clean up the snapshot object. 
    CloseHandle(hThreadSnap); 
    return 0; 
} 

BOOL TerminateProcess(DWORD dwProcessId) 
{ 
    DWORD dwDesiredAccess = PROCESS_TERMINATE; 
    BOOL bInheritHandle = FALSE; 
    HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId); 
    if (hProcess == NULL) 
     return FALSE; 

    UINT uExitCode = 0; 
    BOOL result = TerminateProcess(hProcess, uExitCode); 
    CloseHandle(hProcess); 
    return result; 
} 
相關問題