CreateProcess 函数在默认桌面中创建进程,而不是在新桌面中创建它

问题描述

我正在开发一个小型 C# 应用程序,发现一个奇怪的错误。此应用程序的目标是创建一个新桌面并在其中启动一个进程。

为此,我依赖于以下 win32 函数

[DllImport("user32.dll")]
        public static extern IntPtr CreateDesktop(string lpszDesktop,IntPtr lpszDevice,IntPtr pDevmode,uint dwFlags,uint dwDesiredAccess,IntPtr lpsa);

[DllImport("user32.dll")]
        public static extern bool SwitchDesktop(IntPtr hDesktop);

  [DllImport("kernel32.dll")]
        private static extern bool CreateProcess(
         string lpApplicationName,string lpCommandLine,IntPtr lpProcessAttributes,IntPtr lpThreadAttributes,bool bInheritHandles,int dwCreationFlags,IntPtr lpEnvironment,string lpCurrentDirectory,ref STARTUPINFO lpStartupInfo,ref PROCESS_informatION lpProcessinformation);

现在的情况是我可以创建桌面,切换到它并最终在新创建的桌面中正确启动一些应用程序,例如:Internet Explorer 或 Notepad++ 或 putty.exe 等......但对于其他应用程序,这只是不起作用。即 Chrome、Firefox、Edge 等... 当我尝试使用 firefox 时,进程会在认桌面中启动,尽管我在 CreateProcess 函数中指定了新桌面的名称

我使用的所有代码都非常简单:

 const int norMAL_PRIORITY_CLASS =  0x0020;
static void Main(string[] args){
 var desktopName = "mynewdesktopinwindowsten";
            bool result = true;
            //create the desktop:
            var intHandler = CreateDesktop(desktopName,IntPtr.Zero,//Reserved; must be NULL.
                IntPtr.Zero,//Reserved; must be NULL.
                0x0001,//DF_ALLOWOTHERACCOUNTHOOK  optional
                (uint)AccessRight.GENERIC_ALL,IntPtr.Zero);

            //Switch to the new desktop:
            result = SwitchDesktop(intHandler);
            SetThreadDesktop(intHandler);
         
            if (result)
            {
                 //launch a process inside the new desktop:
                createProcessInsideDesktop(desktopName);
            } 
}

 private static void createProcessInsideDesktop(string desktopName)
        {
            ////set startup parameters:
            STARTUPINFO si = new STARTUPINFO();
            si.cb = (uint)Marshal.SizeOf(si);
            si.lpDesktop = desktopName;
             
            PROCESS_informatION pi = new PROCESS_informatION();

            var filePath = @"C:\Program Files (x86)\Notepad++\notepad++.exe";
            
           
            bool resultCreateProcess = CreateProcess(
                null,filePath,true,norMAL_PRIORITY_CLASS,null,ref si,ref pi);

              //do something to close the desktop and switch to default.......
        }

   [Flags]
    public enum AccessRight : uint
    {
        DESKTOP_REAdobJECTS = 0x00000001,DESKTOP_CREATEWINDOW = 0x00000002,DESKTOP_CREATEMENU = 0x00000004,DESKTOP_HOOKCONTROL = 0x00000008,DESKTOP_JOURNALRECORD = 0x00000010,DESKTOP_JOURNALPLAYBACK = 0x00000020,DESKTOP_ENUMERATE = 0x00000040,DESKTOP_WRITEOBJECTS = 0x00000080,DESKTOP_SWITCHDESKTOP = 0x00000100,GENERIC_ALL = (DESKTOP_REAdobJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU |
            DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK |
            DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP)
    };

上面的代码在 Notepad++ 上运行良好,但是当我更改这一行时。假设我想启动 Firefox: var filePath = @"C:\Program Files\Mozilla Firefox\firefox.exe"; 该进程不是在新桌面中创建的,而是在认桌面中创建的。所以,如果有人能在这里发现一些重要的事情来解决这个问题,我们将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)