c – 获取在某个桌面中打开的所有进程

c – 获取在某个桌面中打开的所有进程,第1张

概述我正在开发一个应用程序,在启动时创建一个新桌面并使用一个键组合我可以在原始桌面和新桌面之间来回移动.在创建时,在新桌面中启动一个新的explorer.exe进程,因此用户可以启动他想要的任何应用程序. 当检测到发送exit命令的键组合时,新桌面将关闭,我们将返回到原始桌面,但用户在新桌面中启动的所有应用程序仍在运行. 有没有办法处理在新桌面上打开的所有这些进程,有一个Window Station的 @H_404_6@ 我正在开发一个应用程序,在启动时创建一个新桌面并使用一个键组合我可以在原始桌面和新桌面之间来回移动.在创建时,在新桌面中启动一个新的explorer.exe进程,因此用户可以启动他想要的任何应用程序.

当检测到发送exit命令的键组合时,新桌面将关闭,我们将返回到原始桌面,但用户在新桌面中启动的所有应用程序仍在运行.

有没有办法处理在新桌面上打开的所有这些进程,有一个Window Station的HANDLE和新桌面的HDESK句柄?

解决方法 感谢DavID Heffernan的想法,我找到了以下解决方案.有了桌面的HDESK句柄,我使用GetThreadDesktop函数与系统中的每个线程进行比较.我不确定它是最高性能的解决方案,我对改进建议持开放态度,但这样做很好:

int main(voID){    // Desktop handles    HDESK currentDesktop = GetsecondDesktop(GetCurrentThreadID());    HDESK secondDesktop = CreateDesktop(L"secondDesktop",NulL,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 sy@R_502_6563@,// 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;}
总结

以上是内存溢出为你收集整理的c – 获取在某个桌面中打开的所有进程全部内容,希望文章能够帮你解决c – 获取在某个桌面中打开的所有进程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1224480.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存