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

时间:2012-09-24 20:30:37

标签: c# windows-8 screen

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

[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);

这曾经按预期工作,但在安装Windows 8(I assume this is the reason, since I see others have the same issue)之后,打开屏幕仍然无法正常工作。我仍然可以将其关闭,但无论我使用MonitorTurnOn运行SendMessage()多少次,我仍然需要移动鼠标或按键才能重新启动显示器。

有关如何在Windows 8上运行的任何建议吗?

4 个答案:

答案 0 :(得分:13)

我遇到了同样的问题,我找到的解决办法是移动鼠标:

mouse_event(MOUSEEVENTF_MOVE, 0, 1, 0, NULL);
Sleep(40);
mouse_event(MOUSEEVENTF_MOVE, 0, -1, 0, NULL);

它会唤醒显示器。 Earlypearl

答案 1 :(得分: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);
}

答案 2 :(得分:1)

对于这个问题,我有同样的想法只是改变了亲爱的早期解决方案,并在Windows XP,7,8,Server 2008上进行了测试,所有这些都完美无缺。

mouse_event(MOUSEEVENTF_MOVE, 0, 1, 0, UIntPtr.Zero);

它不需要被调用两次。

答案 3 :(得分:0)

我发现这个技巧适用于Windows 8.1

关闭它们

SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MonitorShutoff);

打开它们

SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)1);

根据MSN,“1”是将显示器切换到“低功率”,但它可以解决问题。屏幕不会再关闭。