Профессионалы интерфейсного решения:
Недостатки:
Похоже, вы столкнулись с ошибкой в IE, когда он взаимодействует с UAC. Если включен защищенный режим, вы не можете запускать IE как обычный пользователь на любом рабочем столе, кроме стандартного. Чтобы запустить IE на альтернативном рабочем столе, вы должны работать от имени администратора или отключить защищенный режим. Это верно для Vista, W2K8 и Win7.
Что касается других программ, которые вы не можете запустить, к сожалению, я ничего не могу подтвердить. Я пробовал более тридцати различных программ, включая блокнот, calc, все офисные приложения, Visual Studio 2005, 2008 и 2010, справку MSDN и ряд других, и все они работали, как ожидалось, за исключением IE. Есть ли что-то действительно необычное в вашем приложении, из-за которого оно может вести себя неожиданным образом?
Одно замечание - если вы попытаетесь запустить подобное приложение, которое требует повышения прав (например, regedit и т. Д.), Оно завершится ошибкой в CreateProcess с последняя ошибка установлена на ERROR_ELEVATION_REQUIRED.
Для справки, на случай, если я делаю что-то отличное от вас, я использовал следующий код:
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#include <stdio.h>
#include <tchar.h>
#include "windows.h"
HANDLE PerformOpenApp(TCHAR* appPath);
int _tmain(int argc, _TCHAR* argv[])
{
HDESK dNew;
BOOL closedesk;
HANDLE hApp;
//Make a new desktop
dNew = CreateDesktop(_T("kaka"), 0, 0, 0, DESKTOP_SWITCHDESKTOP|
DESKTOP_WRITEOBJECTS|
DESKTOP_READOBJECTS|
DESKTOP_ENUMERATE|
DESKTOP_CREATEWINDOW|
DESKTOP_CREATEMENU, NULL);
if(!dNew)
{
_tprintf(_T("Failed to create new desktop !!\n\n"));
return 0;
}
TCHAR path[MAX_PATH];
_putts(_T("Enter the path of a program to run in the new desktop:\n"));
_getts(path);
while(_tcslen(path) > 0)
{
hApp = PerformOpenApp(path);
if(hApp == 0)
{
_tprintf(_T("Failed to open app, err = %d\n"), GetLastError());
}
else
{
_tprintf(_T("App pid = %d\n"), GetProcessId(hApp));
_putts(_T("Press any key to close the app.\n"));
_gettchar();
TerminateProcess(hApp, 0);
CloseHandle(hApp);
}
_putts(_T("Enter the path of a program to run in the new desktop:\n"));
_getts(path);
}
closedesk = CloseDesktop(dNew);
if(!closedesk)
{
_tprintf(_T("Failed to close new desktop !!\n\n"));
return 0;
}
return 0;
}
HANDLE PerformOpenApp(TCHAR* appPath)
{
STARTUPINFO si = {0};
PROCESS_INFORMATION pi;
si.cb = sizeof(si);
si.lpDesktop = _T("kaka");
BOOL retVal = CreateProcess(NULL, appPath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL,
NULL, &si, &pi);
if (retVal)
{
CloseHandle(pi.hThread);
}
return pi.hProcess;
}