2015-07-13 72 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; 
} 
相关问题