运行Windows 8时,SendMessage/SC_MONITORPOWER不会打开监视器

Erl*_* D. 12 c# screen windows-8

我使用以下代码打开和关闭显示器:

[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MONITORPOWER = 0xF170;
private const int MonitorTurnOn = -1;
private const int MonitorShutoff = 2;

//Turn them off
SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MonitorShutoff);

//Turn them on
SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MonitorTurnOn);
Run Code Online (Sandbox Code Playgroud)

这曾经按预期工作,但在安装Windows 8后(我认为这是原因,因为我看到其他人有同样的问题)打开屏幕将无法正常工作.我仍然可以将其关闭,但无论我使用MonitorTurnOn运行SendMessage()多少次,我仍然需要移动鼠标或按键才能重新启动显示器.

有关如何在Windows 8上运行此工作的任何建议?

小智 13

我有同样的问题,我找到的解决方案是移动鼠标:

mouse_event(MOUSEEVENTF_MOVE, 0, 1, 0, NULL);
Sleep(40);
mouse_event(MOUSEEVENTF_MOVE, 0, -1, 0, NULL);
Run Code Online (Sandbox Code Playgroud)

它会唤醒显示器.Earlypearl

  • 这里不需要任何"睡眠".delta 0,0的单个移动就足够了. (6认同)

Erl*_* D. 7

这是Earlypearl对所需的回答包括:

[DllImport("user32.dll")]
static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, UIntPtr dwExtraInfo);

private const int MOUSEEVENTF_MOVE = 0x0001;

private void Wake(){
    mouse_event(MOUSEEVENTF_MOVE, 0, 1, 0, UIntPtr.Zero);
    Sleep(40);
    mouse_event(MOUSEEVENTF_MOVE, 0, -1, 0, UIntPtr.Zero);
}
Run Code Online (Sandbox Code Playgroud)