2012-09-24 4 views
11

ich meine Monitore ein- und ausschalten, den folgenden Code unter Verwendung von:Sendmessage/SC_MONITORPOWER nicht-Monitor einschalten, wenn 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); 

Diese verwendet, um wie vorgesehen, aber nach der Installation von Windows 8 (I assume this is the reason, since I see others have the same issue) Das Einschalten des Bildschirms funktioniert nicht. Ich kann es immer noch ausschalten, aber egal, wie oft ich SendMessage() mit MonitorTurnOn starte, muss ich immer noch die Maus bewegen oder eine Taste drücken, um die Monitore wieder zu aktivieren.

Haben Sie Vorschläge, wie dies unter Windows 8 funktioniert?

+0

Ist es möglich, nur einen bestimmten Monitor auszuschalten? – Dor

+0

Nicht so weit ich weiß. –

Antwort

12

ich hatte das gleiche Problem, ist die Lösung, die ich gefunden, die Maus zu bewegen:

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

Es wird auf den Monitor wecken. Earlypearl

+1

Danke, obwohl es keine perfekte Lösung ist, scheint es zu funktionieren. Ich durfte deine Antwort nicht bearbeiten, um den DllImport und die Konstante aufzunehmen, also habe ich selbst eine hinzugefügt. –

+5

Keine Notwendigkeit für "Sleep" hier. Eine einzelne Bewegung mit Delta 0, 0 wird ausreichen. –

7

Hier Earlypearl Antwort mit der umfasst benötigt:

[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

ich die gleiche Idee für dieses Problem hatte gerade die liebe earlypearl Lösung ein klein wenig geändert und getestet auf Windows XP, 7, 8, Server 2008 und alles hat perfekt funktioniert.

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

es muss nicht zweimal aufgerufen werden.

0

Ich habe diesen Trick herausgefunden, an den Fenstern arbeiten 8.1

sie

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

sie auf

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

Laut MSN Schalten Schalten Sie "1" Monitor wechseln zu "Low Power", aber es macht den Trick. Der Bildschirm wird nicht mehr ausgeschaltet.

+0

Hat bei W10 nicht funktioniert – user2126375