2012-09-24 9 views
11

zwracam moje monitory i wyłączać za pomocą następującego kodu:SendMessage/SC_MONITORPOWER nie włączy monitor na podczas uruchamiania systemu 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); 

ten używany do pracy zgodnie z przeznaczeniem, ale po zainstalowaniu Windows 8 (I assume this is the reason, since I see others have the same issue) włączenie ekranu nie będzie działać. Nadal mogę go wyłączyć, ale niezależnie od tego, ile razy uruchomię SendMessage() z MonitorTurnOn, nadal muszę przesunąć mysz lub nacisnąć klawisz, aby ponownie włączyć monitory.

Wszelkie sugestie, jak to zrobić w systemie Windows 8?

+0

Czy możliwe jest wyłączenie tylko określonego monitora? – Dor

+0

Nie tak daleko, jak wiem. –

Odpowiedz

12

miałem ten sam problem, rozwiązanie znalazłem to, aby przesunąć mysz:

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

Będzie obudzić monitor. Earlypearl

+1

Dziękuję, mimo że nie jest to idealne rozwiązanie, wydaje się działać. Nie mogłem edytować twojej odpowiedzi, dodając DllImport i stałą, więc dodałem ją poniżej. –

+5

Nie ma tu potrzeby żadnego "uśpienia". Wystarczy jeden ruch z deltą 0, 0. –

7

Oto odpowiedź Earlypearl to za potrzebne obejmuje:

[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

Miałem ten sam pomysł na ten problem właśnie zmienił rozwiązanie drogiego earlypearl za odrobinę i przetestowane na Windows XP, 7, 8, Server 2008 i wszystko działało idealnie.

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

nie trzeba wywoływać dwa razy.

0

Znalazłem tę sztuczkę do pracy w systemie Windows 8.1

Wyłącz je

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

je włączyć

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

Według MSN, "1" jest przełączenie monitora na "Low Power", ale to wystarczy. Ekran się nie wyłącza.

+0

Nie działa dla mnie na W10 – user2126375

Powiązane problemy