无法在使用CreateDesktop Windows 10创建的新桌面上启动新进程
我正在尝试在Windows 10的新桌面上启动新进程“calc.exe”。当我尝试切换桌面时,屏幕变黑(看起来它是一个没有背景的新桌面)。然后它按预期切换回主桌面,我看到calc.exe在那里启动。下面是代码片段。我正在使用Visual Studio 2015进行开发。为什么calc.exe不在第二个桌面上启动无法在使用CreateDesktop Windows 10创建的新桌面上启动新进程,windows,visual-studio,Windows,Visual Studio,我正在尝试在Windows 10的新桌面上启动新进程“calc.exe”。当我尝试切换桌面时,屏幕变黑(看起来它是一个没有背景的新桌面)。然后它按预期切换回主桌面,我看到calc.exe在那里启动。下面是代码片段。我正在使用Visual Studio 2015进行开发。为什么calc.exe不在第二个桌面上启动 HDESK originalDesktop; HDESK secondaryDesktop; originalDesktop = GetThreadDesktop
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);
HDESK-originalDesktop;
HDESK二次桌面;
originalDesktop=GetThreadDesktop(GetCurrentThreadId());
LPWSTR secondaryDesktopName=L“Mysecondary”;
secondaryDesktop=CreateDesktop(secondaryDesktopName,
nullptr,
nullptr,
DF_ALLOWOTHERACCOUNTHOOK,
桌面交换机|
桌面读取对象|
桌面创建窗口|
桌面创建菜单|
桌面控制|
桌面日志记录|
桌面日志回放|
桌面枚举|
桌面写入对象,
nullptr);
//SetThreadDesktop(第二桌面);
SwitchDesktop(第二桌面);
dwordr=0;
STARTUPINFO si;
处理信息;
创建布尔过程;
零内存(&si,sizeof(si));
si.cb=sizeof(si);
si.lpDesktop=secondaryDesktopName;
零内存(&pi,sizeof(pi));
DWORD dwCreationFlags=从作业中创建分离;//创建"UNICODE"环境,;
const LPWSTR calculatorExe=L“C:\\Windows\\System32\\calc.exe”;
processCreated=CreateProcess(calculatorExe,
nullptr,
nullptr,
nullptr,
符合事实的
0,
//dwCreationFlags,
nullptr,
nullptr,
&嗯,
&pi);
//睡眠(4000);
如果(!processCreated)
{
//对数误差
r=GetLastError();
fprintf(stderr,“\n\n创建%S进程时出错,代码:%d\n\n”,calculatorExe,r);
返回r;
}
r=WaitForSingleObject(pi.hProcess,无穷大);
//GetExitCodeProcess(pi.hProcess,&r);
int i=int_MIN;
而(iINT_MIN)i--;
SwitchDesktop(原始桌面);
///////////////////////
关闭桌面(第二桌面);
我试着启动notepad.exe,它运行正常。不确定calc.exe。在Windows 10上,计算器是商店/UWP应用程序
calc.exe
是启动真正计算器的小存根(可能使用)。真正的计算器是由一个对桌面一无所知的Windows服务启动的
这也是你的等待如此之快的原因
calc.exe
要求启动真正的计算器应用程序并退出。notepad.exe也会这样吗?谢谢conio。我尝试了notepad.exe,它被正确启动。我现在很惊讶。您知道为什么会发生这种情况,或者使用calc.exe调试此问题吗?