Ho due monitor (HP EliteDisplay E190i), entrambi sono collegati a due computer (2x VGA + DP).
Questi monitor supportano anche DVI, quindi, invece di avere uno stupido pulsante di commutazione, ogni volta che desidero passare da un computer all'altro, devo navigare nel menu dei monitor. Avevo i monitor più scomodi e il passaggio è stato davvero semplice, ma non riesco ad abituarmi all'intera navigazione - spesso confonde ...Come posso forzare il monitor in modalità risparmio energetico immediatamente in C#?
Quindi ecco l'accordo: voglio essere in grado di passare rapidamente tra i computer eseguendo un comando. Ovviamente questo non può essere fatto direttamente (i computer non sono collegati tra di loro in alcun modo), ma quando i monitor entrano in modalità risparmio energetico (o quando il sistema operativo li spegne), i monitor iniziano a cercare gli input disponibili. In questo modo si bloccavano nell'altro computer e il problema veniva risolto.
introduzione Basta, però, ho provato this solution e ha funzionato grande, ma non è stato perfetto:
- Aveva un fade out di animazione che ha avuto un paio di secondi prima che il monitor effettivamente spento
- ho dovuto a non toccare il mouse/tastiera per tutta la durata della dissolvenza sopra fuori animazione, altrimenti si otterrebbe annullato
ho provato a rendere invalido l'ingresso in base alla this answer prima di inviare il monitor a dormire, poi ri-consenta dopo 5 secondi, ma che anche non ha funzionato perché:
- Mi c'è necessario per eseguire l'applicazione con diritti di amministratore, altrimenti ingresso non sarebbe stato bloccato
- Anche se la input è stato bloccato durante l'esecuzione con diritti di amministratore, potevo comunque spostare il mouse o premere alcuni tasti sulla tastiera durante l'animazione fade out per cancellarlo (anche se il puntatore non si spostava, o l'input della tastiera era ignorato).
Ecco il mio codice:
[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);
}
}
Io uso Windows 7 Enterprise x64 su entrambi i computer.
C'è un modo per far funzionare tutta questa cerimonia?
Quindi il problema con la seconda soluzione era che non erano in grado di eseguirlo con privilegi di amministratore? –
No, l'input è stato bloccato quando l'ho eseguito con diritti di amministratore, come previsto. Tuttavia, anche se l'input è stato bloccato, spostando il mouse o premendo un tasto sulla mia tastiera (fisicamente) è stata annullata l'animazione in dissolvenza, anche se il _pointer_ non si spostava e l'input della tastiera veniva ignorato (i tasti erano premuti, ma non c'era testo digitato nel blocco note). –
come fare per bloccare l'input prima di inviare il comando sleep – RomCoo