SetThreadDesktop没有切换到其他桌面的形式。

问题描述 投票:2回答:1
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上?

c# winforms winapi desktop
1个回答
0
投票

注释 [STAThread] 并尝试手动激活STA:同时确保在调用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()
        {
            int ret = 0;
            IntPtr NEWDESKTOP = CreateDesktop("dew", null, null, 0, ACCESS_MASK.GENERIC_ALL, IntPtr.Zero);

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

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

            ret = SwitchDesktop(OLDDESKTOP);
            CloseDesktop(NEWDESKTOP);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.