Mam dwa monitory (HP EliteDisplay E190i), oba są podłączone do dwóch komputerów (2x VGA + DP).
Monitory te obsługują również DVI, więc zamiast mieć głupi przycisk przełączania, za każdym razem, gdy chcę przełączać się między komputerami, muszę poruszać się po menu monitorów. Miałem kiedyś głupsze monitory i przełączanie było naprawdę łatwe, ale po prostu nie mogę się przyzwyczaić do całej nawigacji - często mylą się ...Jak mogę natychmiast wcisnąć monitor w tryb oszczędzania energii w C#?
A oto oferta - chcę szybko zmienić między komputerami, wykonując polecenie. Oczywiście nie można tego zrobić bezpośrednio (komputery nie są ze sobą w żaden sposób połączone), ale kiedy monitory wchodzą w tryb oszczędzania energii (lub gdy system operacyjny je wyłącza), monitory rozpoczynają skanowanie w poszukiwaniu dostępnych wejść. W ten sposób zablokują się na innym komputerze i problem zostanie rozwiązany.
Dość wprowadzenie choć próbowałem this solution i to działało świetnie, ale to nie było idealne:
- Miał zanikanie animacji, które trwało kilka sekund przed monitor faktycznie wyłączony
- musiałem nie dotykać myszy/klawiatury na czas trwania powyższego wyciszeniem animacji, w przeciwnym razie byłoby to anulowane
próbowałem wyłączyć wejście według this answer przed wysłaniem monitora do snu, a następnie ponowne włączenie go po 5 sekundach, ale to również nie działa, ponieważ:
- Wymagało mnie do uruchomienia aplikacji z prawami administratora, inaczej wejście nie będzie blokowane
- Chociaż wejście zostało zablokowane podczas działania z prawami administratora, nadal mogłem poruszać myszą lub uderzać w klawisze klawiatury podczas animacji zaniku, aby ją anulować (mimo że wskaźnik się nie poruszył lub wejście klawiatury zostało zignorowane).
Oto mój kod:
[DllImport("user32.dll")]
private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);
[DllImport("user32.dll")]
private static extern int BlockInput(int fBlockIt);
static void Main()
{
SendMessage(0xFFFF, 0x112, 0xF170, 2);
try
{
int result = BlockInput(1);
Console.WriteLine(result);
Thread.Sleep(5000);
}
finally
{
BlockInput(0);
}
}
używam Windows 7 Enterprise 64 na obu komputerach.
Czy istnieje sposób, aby cała ta ceremonia zadziałała?
Więc problem z drugiego rozwiązania było to, że nie byli w stanie go uruchomić z uprawnieniami administratora? –
Nie, dane wejściowe zostały zablokowane, gdy uruchomiłem je z prawami administratora, zgodnie z oczekiwaniami. Jednak mimo że wejście zostało zablokowane, przesuwanie myszy lub naciśnięcie klawisza na klawiaturze (fizycznie) anulowało animację zaniku - pomimo, że _pointer_ nie poruszyło się, a wejście klawiatury zostało zignorowane (naciśnięto klawisze, ale tekst nie był wpisane do notatnika). –
Jak zablokować wejście przed wysłaniem polecenia sleep – RomCoo