gpt4 book ai didi

c++ - 获取某个桌面打开的所有进程

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:30 25 4
gpt4 key购买 nike

我正在开发一个应用程序,该应用程序在启动时创建一个新桌面,并使用组合键我可以在原始桌面和新桌面之间来回移动。创建时,在新桌面中启动一个新的 explorer.exe 进程,因此用户可以启动他想要的任何应用程序。

当检测到发送退出命令的组合键时,新桌面关闭,我们回到原来的桌面,但用户在新桌面上启动的所有应用程序仍在运行。

有没有办法获得在新桌面中打开的所有这些进程的句柄,有一个用于 Window Station 的 HANDLE 和一个用于新桌面的 HDESK 句柄桌面?

最佳答案

感谢 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;
}

关于c++ - 获取某个桌面打开的所有进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31382630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com