Я создал виртуальный рабочий стол в своем приложении 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;
}
}