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", но это делает свое дело. Экран больше не выключается.

Другие вопросы по тегам