谁能帮我分析一下这段代码,我在创建桌面过程中,为何任务栏消失? 如何避免?
/*
3@!!
*/
char* MeDsktp = "MyDeskTop";
SECURITY_DESCRIPTOR sd;
SECURITY_ATTRIBUTES sa;
LPSECURITY_ATTRIBUTES lpsa = NULL;
OSVERSIONINFO osv;
osv.dwOSVersionInfoSize = sizeof(osv);
GetVersionEx(&osv);
if(osv.dwPlatformId == VER_PLATFORM_WIN32_NT) //NT系统的话,需要指定lpsa参数
{
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = true;
sa.lpSecurityDescriptor = &sd;
lpsa = &sa;
}
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES;
si.wShowWindow = SW_SHOW;
si.lpDesktop = MeDsktp;
PROCESS_INFORMATION pi; //尝试打开特定的桌面
HDESK DsktpHandle = OpenDesktop( MeDsktp,
DF_ALLOWOTHERACCOUNTHOOK,
true,
DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if(!DsktpHandle) //打开失败则创建该桌面
{
DsktpHandle = CreateDesktop(MeDsktp,
NULL,
NULL,
DF_ALLOWOTHERACCOUNTHOOK,
DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS,
lpsa);
if(!DsktpHandle)
{
ShowMessage("Des");
}
}
if(DsktpHandle)
{
SwitchDesktop(DsktpHandle);//切换到特定的桌面,否则新的程序进程将看不到
}