天天看點

VC建立虛拟桌面

/************************************************* 
     * Create a new Desktop and run a Process in it. * 
     * (Win NT+).                                    * 
     *************************************************/  
    int DLL_EXP_IMP WINAPI Process_Desktop(char *szDesktopName, char *szPath)  
    {  
     HDESK hOriginalThread;  
     HDESK hOriginalInput;  
     HDESK hNewDesktop;  

     // Save original ...  
     hOriginalThread = GetThreadDesktop(GetCurrentThreadId());  
     hOriginalInput = OpenInputDesktop(, FALSE, DESKTOP_SWITCHDESKTOP);  

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

     // Execute process in new desktop  
     StartProcess(szDesktopName, szPath);  

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

     // Close the Desktop  
     CloseDesktop(hNewDesktop);  

     return ;  
    }  






    /************************************************ 
     * Create a new Desktop and run a Thread in it. * 
     * (Win NT+).                                   * 
     ************************************************/  
    int DLL_EXP_IMP WINAPI Thread_Desktop(LPTHREAD_START_ROUTINE ThreadFunc, THREAD_DATA *td)  
    {  
     HDESK hOriginalThread;  
     HDESK hOriginalInput;  
     HDESK hNewDesktop;  

     // Save original ...  
     hOriginalThread = GetThreadDesktop(GetCurrentThreadId());  
     hOriginalInput = OpenInputDesktop(, FALSE, DESKTOP_SWITCHDESKTOP);  

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

     // Execute thread in new desktop  
     td->hDesk = hNewDesktop;  
     StartThread(ThreadFunc, td);  

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

     // Close the Desktop  
     CloseDesktop(hNewDesktop);  

     return ;  
    }