Переключить виртуальный рабочий стол перед режимом гибернации
Я создал виртуальный рабочий стол в своем приложении C# winform со следующим кодом ниже.
#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;
}
}