SendMessage/SC_MONITORPOWER не будет включать монитор при работе в 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);
Раньше это работало как задумано, но после установки Windows 8 ( я полагаю, что это причина, так как я вижу, что у других есть такая же проблема), включение экрана не будет работать. Я все еще могу отключить его, но независимо от того, сколько раз я запускаю SendMessage() с MonitorTurnOn, мне все равно приходится перемещать мышь или нажимать клавишу, чтобы снова включить мониторы.
Любые предложения о том, как заставить это работать на Windows 8?
4 ответа
У меня была та же проблема, решение, которое я нашел, это переместить мышь:
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" - это переключение монитора на "Low Power", но это делает свое дело. Экран больше не выключается.