切换/创建桌面C#内部打开表单

切换/创建桌面C#内部打开表单,c#,multithreading,forms,class,C#,Multithreading,Forms,Class,您好,我已经在这个程序上工作了很长一段时间,我的目标是有一个锁定系统,可以在桌面之间切换,在第二个屏幕上有一个登录表单,允许您登录,但我遇到了一个问题,我无法从2太近的登录,所以第二个桌面可以被破坏,我必须手动关闭它我已经尝试过了调用close和hide时,我试图破坏进程,但我不会关闭,但它不会关闭。 如果我使用.ShowDialog方法打开表单,但如果我使用.show方法打开表单。它将关闭表单,但工作的任何部分都将显示为空白窗口 form1这是处理请求的主要表单 public

您好,我已经在这个程序上工作了很长一段时间,我的目标是有一个锁定系统,可以在桌面之间切换,在第二个屏幕上有一个登录表单,允许您登录,但我遇到了一个问题,我无法从2太近的登录,所以第二个桌面可以被破坏,我必须手动关闭它我已经尝试过了调用close和hide时,我试图破坏进程,但我不会关闭,但它不会关闭。 如果我使用.ShowDialog方法打开表单,但如果我使用.show方法打开表单。它将关闭表单,但工作的任何部分都将显示为空白窗口

form1这是处理请求的主要表单

        public Form1()
        {
            InitializeComponent();
            // Create the thread object. This does not start the thread.
            Worker workerObject = new Worker();
            Thread workerThread = new Thread(workerObject.DoWork);

            workerThread.Start();
            System.Threading.Thread.Sleep(3000);
            workerObject.RequestStop();

        }

    }


    public partial class Worker
    {
            static Desctop mDesktop = new Desctop();

        // This method will be called when the thread is started. 
        public  void DoWork()
        {

            mDesktop.CreateNewDesktop("Mayshotspot");
            using (Form2 frm = new Form2())
            {

                frm.ShowDialog();
                while (!_shouldStop) { }
                frm.Close(); // this will not close the form 
            }

            mDesktop.DestroyDesktop();
            mDesktop.destroyProces();




        }

        public void RequestStop()
        {
            _shouldStop = true;
        }
        // Volatile is used as hint to the compiler that this data 
        // member will be accessed by multiple threads. 
        private volatile bool _shouldStop;



    }




}
屏幕开关类

        static string DesktopName = "Mayshotspot";
        ArrayList list = new ArrayList();
        public  bool NeedBootStrapping()
        {
            return (GetDesktopName() == DesktopName);
        }
        public static string GetDesktopName()
        {
            int DLength = 0, DHandle = GetThreadDesktop(GetCurrentThreadId());
            StringBuilder DName = new StringBuilder();
            GetUserObjectInformation(DHandle, UOI_NAME, DName, 0, ref DLength);
            if (DLength != 0) GetUserObjectInformation(DHandle, UOI_NAME, DName, DLength, ref DLength);
            return (DName.ToString());
        }

        public void CreateNewDesktop(string DesktopName)
        {
            GetThreadDesktop(GetCurrentThreadId());
            OpenInputDesktop(0, false, DESKTOP_SWITCHDESKTOP);
            int DesktopHandle = CreateDesktop(DesktopName, "", 0, 0, GENERIC_ALL, 0);
            SetThreadDesktop(DesktopHandle);
            SwitchDesktop(DesktopHandle);
        }
        public void DestroyDesktop()
        {
            CreateNewDesktop("Default");
        }

        public Process StartProcess(string Path)
        {
            PROCESS_INFORMATION PI = new PROCESS_INFORMATION();
            STARTUPINFO SI = new STARTUPINFO();
            SI.cb = Marshal.SizeOf(SI);
            SI.lpDesktop = DesktopName;
            bool Result = CreateProcess(null, Path, IntPtr.Zero, IntPtr.Zero, true, NORMAL_PRIORITY_CLASS, IntPtr.Zero, null, ref SI, ref PI);
            if (Result)
            {
                // WaitForSingleObject(PI.hProcess, INFINITE);
                // CloseHandle(PI.hProcess);
                //CloseHandle(PI.hThread);
                list.Add(PI.dwProcessId);
                return Process.GetProcessById(PI.dwProcessId);
            }
            else
            {
                DestroyDesktop();
                return null;
            }
        }

        public void SetProcessPriorityHigh()
        {
            SetThreadPriority(GetCurrentThread(), THREAD_BASE_PRIORITY_MAX);
            SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
        }

        public void ExitProces(int uExitCode)
        {

           // ExitProcess(uExitCode);
            Process.GetProcessById(uExitCode).Kill();
        }
        public void destroyProces()
        {
            Process thisProc = Process.GetCurrentProcess();
            foreach (int p in list)
            {
                try
                {
                    Process.GetProcessById(p).Kill();
                }
                catch (Exception ex)
                {

                }
            }
        }

        public void exitProces()
        {
            ExitProcess(0);
        }

表单2-出现在桌面开关上的登录屏幕目前处于默认状态,直到我找到它不关闭的原因为止

请查看可能的解决方案。您好,我已将其分解,我可以让它启动,但不能将其放在第二个桌面上,或者我将获得框架,但它不会自行关闭更多:-(例如)使用 S删除所有<代码>,删除<代码>命名空间< /代码>,删除空白行,是否真的“<代码> ExtNe>代码>声明?等等。您的读者必须水平滚动和垂直滚动,这通常会使这个问题变得很不吸引人。对不起,我希望这对你来说是一个更好的阅读。我已经删除了所有的基本功能,并删除了一些函数