gpt4 book ai didi

c++ - SwitchDesktop 暂时工作,但片刻后切换回来

转载 作者:可可西里 更新时间:2023-11-01 13:45:19 28 4
gpt4 key购买 nike

我有一些代码可以创建一个新桌面并在该桌面中启动一个进程。

在一些选择的 Windows XP 机器上,当这段代码运行时,我可以看到它切换到新桌面并启动进程,但几乎立即,桌面切换回正常桌面。

此代码在大约 98% 的机器上运行良好,而且我似乎无法找出任何导致此代码无法在其他机器上运行的原因。

SwitchDesktop 应该可靠吗?我可以 Hook 对可能从另一个应用程序调用的 SwitchDesktop 的调用吗?

我的代码:

int DLL_EXP_IMP WINAPI Process_Desktop(char *szDesktopName, char *szPath)
{
HDESK hOriginalThread;
HDESK hOriginalInput;
HDESK hNewDesktop;
int procSuccess;
// Save original ...
hOriginalThread = GetThreadDesktop(GetCurrentThreadId());
hOriginalInput = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP);

// Create a new Desktop and switch to it
hNewDesktop = CreateDesktop(szDesktopName, NULL, NULL, DF_ALLOWOTHERACCOUNTHOOK, GENERIC_ALL, NULL);
SetThreadDesktop(hNewDesktop);
SwitchDesktop(hNewDesktop);

// This call blocks until the process exits, and is confirmed to work on the affected machines
procSuccess = StartProcess(szDesktopName, szPath);

// Restore original ...
SwitchDesktop(hOriginalInput);
SetThreadDesktop(hOriginalThread);

// Close the Desktop
CloseDesktop(hNewDesktop);

if (procSuccess != 0)
{
return procSuccess;
}
else
{
return 0;
}
}

最佳答案

我的猜测是 SetThreadDesktop() 失败了。

来自 MSDN:“如果调用线程在其当前桌面上有任何窗口或 Hook (除非 hDesktop 参数是当前桌面的句柄),SetThreadDesktop 函数将失败。”

您提到 StartProcess() 会阻塞,直到进程终止。这样就没有人引用新桌面,因此桌面将消失。

您可能需要考虑在 C++ 中包装易出错的系统调用-- 失败时抛出异常。当然,CreateDesktop/CloseDesktop 对属于 C++ 资源包装器。这是 2013 年!

关于c++ - SwitchDesktop 暂时工作,但片刻后切换回来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12583708/

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