2012-09-24 14 views
11

mi rivolgo il mio monitor e disattivare utilizzando il seguente codice:SendMessage/SC_MONITORPOWER non si accende il monitor su ON durante l'esecuzione di 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); 

Ciò usata per funzionare come previsto, ma dopo l'installazione di Windows 8 (I assume this is the reason, since I see others have the same issue) accendere lo schermo non funzionerà. Posso ancora spegnerlo, ma non importa quante volte eseguo SendMessage() con MonitorTurnOn, devo ancora spostare il mouse o premere un tasto per riaccendere i monitor.

Qualche suggerimento su come farlo funzionare su Windows 8?

+0

è possibile spegnere solo un monitor specifico? – Dor

+0

Non per quanto ne so. –

risposta

12

Ho avuto lo stesso problema, la soluzione che ho trovato è quello di spostare il mouse:

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

Si sveglierà il monitor. Earlypearl

+1

Grazie, anche se non è una soluzione perfetta, sembra funzionare. Non mi è stato permesso di modificare la tua risposta per includere DllImport e la costante, quindi ne ho aggiunta una sotto. –

+5

Non c'è bisogno di alcun 'Dormire' qui. Una singola mossa con delta 0, 0 sarà sufficiente. –

7

Ecco la risposta di Earlypearl con la necessaria comprende:

[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

Ho avuto la stessa idea di questo problema solo cambiato la soluzione del caro earlypearl un pochino e testato su Windows XP, 7, 8, Server 2008 e tutto ha funzionato perfettamente.

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

non ha bisogno di essere chiamato due volte.

0

ho scoperto questo trucco per funzionare su Windows 8.1

loro

Spegnere

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

accenderli

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

Secondo MSN, "1" è quello di cambiare il monitor a "Low Power" ma fa il trucco. Lo schermo non si spegnerà più.

+0

Non ha funzionato per me su W10 – user2126375

Problemi correlati