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

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

[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上运行此工作的任何建议?

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

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

它会唤醒显示器。 Earlypearl

这是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); } 

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

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

它不需要被调用两次。

我发现这个技巧适用于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”是将显示器切换到“低功率”,但它可以解决问题。 屏幕不会再关闭。