18

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

[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 之后(我认为这是原因,因为我看到其他人也有同样的问题)打开屏幕将不起作用。我仍然可以将其关闭,但无论我使用 MonitorTurnOn 运行 SendMessage() 多少次,我仍然必须移动鼠标或按下某个键才能重新打开监视器。

关于如何在 Windows 8 上进行这项工作的任何建议?

4

4 回答 4

15

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

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

它将唤醒显示器。早珠

于 2012-12-28T10:39:08.640 回答
8

这是 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);
}
于 2013-01-05T12:23:53.237 回答
2

我对这个问题有同样的想法只是稍微改变了亲爱的 earlypearl 的解决方案,并在 Windows XP、7、8、Server 2008 上对其进行了测试,并且一切正常。

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

它不需要被调用两次。

于 2013-12-14T05:33:40.867 回答
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”是将显示器切换到“低功耗”,但它可以解决问题。屏幕将不再关闭。

于 2016-03-18T08:05:04.180 回答