2012-09-24 14 views
11

vuelvo los monitores de encendido y apagado mediante el siguiente código:SendMessage/SC_MONITORPOWER no se enciende monitor en cuando se ejecuta 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); 

Esto funcionaba según lo previsto, pero después de la instalación de Windows 8 (I assume this is the reason, since I see others have the same issue) encender la pantalla no funcionará. Todavía puedo desactivarlo, pero no importa cuántas veces ejecute SendMessage() con MonitorTurnOn, aún tengo que mover el mouse o presionar una tecla para volver a encender los monitores.

¿Alguna sugerencia sobre cómo hacer que esto funcione en Windows 8?

+0

¿es posible apagar solo un monitor específico? – Dor

+0

No tan lejos como sé. –

Respuesta

12

que tenían el mismo problema, la solución que encontré es mover el ratón:

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

Se despertará el monitor. Earlypearl

+1

Gracias, a pesar de que no es una solución perfecta, parece funcionar. No se me permitió editar tu respuesta para incluir DllImport y constante, así que agregué una a continuación. –

+5

No hay necesidad de ningún 'Sleep' aquí. Un único movimiento con delta 0, 0 será suficiente. –

7

Aquí está la respuesta de Earlypearl con la necesaria incluye:

[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); 
} 
1

tuve la misma idea para este problema sólo ha cambiado la solución de la querida earlypearl un poquito y lo ha probado en Windows XP, 7, 8, Servidor 2008 y todo funcionó a la perfección.

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

no necesita ser llamado dos veces.

0

He descubierto este truco para funcionar en Windows 8.1

apagarlos

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

los convierten en

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

De acuerdo con MSN, "1" es para cambiar el monitor a "Baja potencia", pero funciona. La pantalla no se apagará más.

+0

No funcionó para mí en W10 – user2126375

Cuestiones relacionadas