我正在尝试推出一个新流程' calc.exe'在Windows 10上的新桌面上。当我尝试切换桌面时,屏幕变为黑色(看起来像是一个没有背景的新桌面)。然后按预期切换回主桌面,我看到在那里启动了calc.exe。以下是代码段。我正在使用Visual Studio 2015进行开发。为什么calc.exe无法在第二个桌面上启动?
HDESK originalDesktop;
HDESK secondaryDesktop;
originalDesktop = GetThreadDesktop(GetCurrentThreadId());
LPWSTR secondaryDesktopName = L"Mysecondary";
secondaryDesktop = CreateDesktop(secondaryDesktopName,
nullptr,
nullptr,
DF_ALLOWOTHERACCOUNTHOOK,
DESKTOP_SWITCHDESKTOP |
DESKTOP_READOBJECTS |
DESKTOP_CREATEWINDOW |
DESKTOP_CREATEMENU |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALRECORD |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_ENUMERATE |
DESKTOP_WRITEOBJECTS,
nullptr);
//SetThreadDesktop(secondaryDesktop);
SwitchDesktop(secondaryDesktop);
DWORD r = 0;
STARTUPINFO si;
PROCESS_INFORMATION pi;
bool processCreated;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.lpDesktop = secondaryDesktopName;
ZeroMemory(&pi, sizeof(pi));
DWORD dwCreationFlags = CREATE_BREAKAWAY_FROM_JOB; // | CREATE_UNICODE_ENVIRONMENT;
const LPWSTR calculatorExe = L"C:\\Windows\\System32\\calc.exe";
processCreated = CreateProcess(calculatorExe,
nullptr,
nullptr,
nullptr,
TRUE,
0,
//dwCreationFlags,
nullptr,
nullptr,
&si,
&pi);
//Sleep(4000);
if (!processCreated)
{
//logerror
r = GetLastError();
fprintf(stderr, "\n\nError while creating %S process, Code: %d\n\n", calculatorExe, r);
return r;
}
r = WaitForSingleObject(pi.hProcess, INFINITE);
//GetExitCodeProcess(pi.hProcess, &r);
int i=INT_MIN;
while (i < INT_MAX) i++;//Add some delay so that calc.exe //gets launched
//while (i > INT_MIN) i--;
SwitchDesktop(originalDesktop);
///////////////////////
CloseDesktop(secondaryDesktop);
我尝试启动notepad.exe,但它确实有效。不确定calc.exe。
答案 0 :(得分:4)
在Windows 10上,Calculator是Store / UWP应用程序。
calc.exe
是一个启动真实计算器的小存根(可能使用Application Activation Manager)。真正的计算器由Windows服务启动,该服务对您的桌面一无所知。
这也是你的等待如此快速满足的原因。 calc.exe
要求启动真实的计算器应用并退出。