C# SetThreadDesktop не переключает форму на другой рабочий стол - PullRequest
2 голосов
/ 27 апреля 2020
private async void WrongPassword_Load(object sender, EventArgs e)
        {
                IntPtr NEWDESKTOP = CreateDesktop("dew", IntPtr.Zero, IntPtr.Zero, 0, (uint) DESKTOP_ACCESS.GENERIC_ALL,IntPtr.Zero);
                IntPtr OLDDESKTOP = GetThreadDesktop(GetCurrentThreadId());
                SwitchDesktop(NEWDESKTOP);

                    SetThreadDesktop(NEWDESKTOP);

                Thread.CurrentThread.TrySetApartmentState(ApartmentState.STA);
                ShowIcon = false;
                Text = "";
                TopMost = true;
                ControlBox = false;
                FormBorderStyle = FormBorderStyle.None;
                WindowState = FormWindowState.Maximized;
                button1.Enabled = false;
                MessageCycle();
                var i = 60;
                Task.Factory.StartNew(() =>
                {
                    SoundPlayer dewd = new SoundPlayer(Resources.WrongPassword);
                    dewd.PlaySync();
                });
                PlayMusic();
                while (i > 0)
                {
                    CountDownLabel.Text = "Please wait " + i +
                                 " seconds before you can dismiss to prevent \n DDOS, BRUTE FORCE ATTACKS";
                    i = i - 1;
                    Task.Delay(1000);
                }
                SetThreadDesktop(OLDDESKTOP);
                CloseDesktop(NEWDESKTOP);
                SwitchDesktop(OLDDESKTOP);
                CountDownLabel.Text = "We are not responsible if you lose your password and files";
                button1.Enabled = true;
        }

Когда я помещаю SetThreadDesktop (NEWDESKTOP), моя форма не переносится с моего текущего рабочего стола на NEWDESKTOP, я также помещаю TrySetApartmentState (ApartmentState.STA), и он все еще не работает, может кто-нибудь дать мне решение как перенести форму с вашего текущего рабочего стола в NEWDESKTOP?

1 Ответ

0 голосов
/ 30 апреля 2020

Прокомментируйте [STAThread] и попробуйте активировать STA вручную: также убедитесь, что не используете ничего, что помешает вам переключиться на рабочий стол, прежде чем звонить SetThreadDesktop

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
namespace WindowsFormsApp1
{

    static class Program
    {
        [Flags]
        internal enum ACCESS_MASK : uint
        {
            DESKTOP_NONE = 0,
            DESKTOP_READOBJECTS = 0x0001,
            DESKTOP_CREATEWINDOW = 0x0002,
            DESKTOP_CREATEMENU = 0x0004,
            DESKTOP_HOOKCONTROL = 0x0008,
            DESKTOP_JOURNALRECORD = 0x0010,
            DESKTOP_JOURNALPLAYBACK = 0x0020,
            DESKTOP_ENUMERATE = 0x0040,
            DESKTOP_WRITEOBJECTS = 0x0080,
            DESKTOP_SWITCHDESKTOP = 0x0100,
            GENERIC_ALL = 0x10000000,
        }

        [DllImport("user32.dll", EntryPoint = "CreateDesktop", CharSet = CharSet.Unicode, SetLastError = true)]
        public static extern IntPtr CreateDesktop(
                    [MarshalAs(UnmanagedType.LPWStr)] string desktopName,
                    [MarshalAs(UnmanagedType.LPWStr)] string device, // must be null.
                    [MarshalAs(UnmanagedType.LPWStr)] string deviceMode, // must be null,
                    [MarshalAs(UnmanagedType.U4)] int flags,  // use 0
                    [MarshalAs(UnmanagedType.U4)] ACCESS_MASK accessMask,
                    IntPtr attributes);

        [DllImport("Kernel32.dll", SetLastError = true)]
        public static extern uint GetCurrentThreadId();
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr GetThreadDesktop(uint dwThreadId);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern int SetThreadDesktop(IntPtr hDesktop);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern int SwitchDesktop(IntPtr hDesktop);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern int CloseDesktop(IntPtr hDesktop);
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        //[STAThread]
        static void Main()
        {
            IntPtr NEWDESKTOP = CreateDesktop("dew", null, null, 0, ACCESS_MASK.GENERIC_ALL, IntPtr.Zero);
            int ret = Marshal.GetLastWin32Error();

            IntPtr OLDDESKTOP = GetThreadDesktop(GetCurrentThreadId());
            ret = SetThreadDesktop(NEWDESKTOP);
            ret = Marshal.GetLastWin32Error();
            ret = SwitchDesktop(OLDDESKTOP);

            Thread.CurrentThread.TrySetApartmentState(ApartmentState.STA);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            CloseDesktop(NEWDESKTOP);
        }
    }
}
...