Подтвердить что ты не робот

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?

4b9b3361

Ответ 1

У меня была та же проблема, решение, которое я нашел, - это перемещение мыши:

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

Он запустит монитор. Earlypearl

Ответ 2

Здесь ответ 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);
}

Ответ 3

У меня была такая же идея для этой проблемы. Просто изменил дорогостоящее решение earlypearl, и он протестировал его на Windows XP, 7, 8, Server 2008 и все отлично работало.

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

его не нужно вызывать дважды.

Ответ 4

Я нашел этот трюк для работы над окнами 8.1

Отключите их

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

Включите их

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

В соответствии с MSN, "1" означает переключить монитор на "Низкая мощность", но это делает трюк. Экран больше не будет отключен.