Переключить виртуальный рабочий стол перед режимом гибернации - PullRequest
0 голосов
/ 30 октября 2018

Я создал виртуальный рабочий стол в своем приложении winform C # со следующим кодом ниже.

#region win32
    [DllImport("user32.dll")]
    public static extern IntPtr CreateDesktop(string lpszDesktop, IntPtr lpszDevice, IntPtr pDevmode, int dwFlags, uint dwDesiredAccess, IntPtr lpsa);
    [DllImport("user32.dll")]
    public static extern bool SwitchDesktop(IntPtr hDesktop);
    [DllImport("user32.dll")]
    public static extern bool CloseDesktop(IntPtr handle);
    [DllImport("user32.dll")]
    public static extern bool SetThreadDesktop(IntPtr hDesktop);
    [DllImport("user32.dll")]
    public static extern IntPtr GetThreadDesktop(int dwThreadId);
    [DllImport("kernel32.dll")]
    public static extern int GetCurrentThreadId();

    enum DESKTOP_ACCESS : 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 = (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU |
                        DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK |
                        DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP),
    }
    #endregion

    IntPtr hOldDesktop;
    IntPtr hNewDesktop;

    hOldDesktop = GetThreadDesktop(GetCurrentThreadId());
    hNewDesktop = CreateDesktop("ScreenLock", IntPtr.Zero, IntPtr.Zero, 0, (uint)DESKTOP_ACCESS.GENERIC_ALL, IntPtr.Zero);
                SwitchDesktop(hNewDesktop);
                SetThreadDesktop(hNewDesktop);

Приложение, которое я пытаюсь сделать, похоже на заставку, но форма закрывается только при нажатии кнопки. Эта форма является полноэкранной формой. Прямо сейчас проблема, которую я получаю, состоит в том, что с этой полноэкранной формой, работающей на виртуальном рабочем столе, и компьютер переходит в режим гибернации, форма всегда будет сверху, а экран входа в систему будет сзади, что мешает мне нажимать кнопку прямо после того, как я снова включу свой компьютер, пока не нажму Ctrl + Alt + Del и войду в систему. Есть ли какое-либо решение для этой проблемы?

Есть ли способ, чтобы при входе в компьютер из режима гибернации находился экран входа в систему?

Я попробовал следующий код ниже, но не получил работу ...

SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
    //Event definition
    void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
    {
        //Use switch case to identify the session switch reason.
        //Code accordingly.
        switch (e.Reason)
        {
            case SessionSwitchReason.SessionLock:
                this.Hide();
                break;
            case SessionSwitchReason.SessionUnlock:
                break;
            default:
                break;
        }
    }
...