2012-08-11 12 views
10

Ho cercato di oscurare uno schermo su una piattaforma Windows dal mio programma. So che c'è un SetMonitorBrightness API che permette questo, ma il problema per me è che sarebbe bello poter oscurare lo schermo anche su Windows XP (che questa API non supporta) e anche schermi sfocati sui computer desktop.Dim schermo su Windows con C++

Così ho fatto qualche ricerca e ho trovato this utility che sembra offuscare il mio schermo su un desktop Windows XP senza problemi. Ho provato a contattare l'autore per scoprire come hanno implementato il dimmer, ma non ho sentito da loro.

Quindi ero curioso di sapere dagli sviluppatori di questo sito, come pensi che siano riusciti a oscurare lo schermo quando l'API SetMonitorBrightness non è supportata?

PS. Sono uno sviluppatore newbie che sto cercando di scrivere un programma di risparmio energetico per la nostra piccola impresa. È un'organizzazione no-profit e non abbiamo fondi per assumere uno sviluppatore Windows per farlo per noi. La maggior parte dei nostri computer sono desktop Windows XP, quindi come puoi vedere non posso utilizzare SetMonitorBrightness API poiché è ampiamente documentato sul web.

Grazie in anticipo.

risposta

3

Perdonami se questa informazione è obsoleta, ma ho fatto questo in passato utilizzando SetDeviceGammaRamp. La versione 'Get' è disponibile anche per il salvataggio e il ripristino di stato. L'ho visto usato nei programmi C#, quindi potrebbe ancora essere rilevante anche se non troppo comune.

+0

Molto bella aggiunta. Grazie! Devo provarlo. La mia unica preoccupazione è che la descrizione dell'API dice: "Non tutte le schede video a colori diretti supportano rampe gamma caricabili". – c00000fd

4

Nel caso in cui si citi, dare un'occhiata allo screensaver con Dependancy Walker. La mia ipotesi è che creino una finestra a schermo intero e usino SetLayeredWindowAttributes() per impostare un'impostazione semi-opaca per la finestra, rendendo in tal modo la luminosità dello schermo. Dubito che ti farebbe risparmiare molti soldi.

Si potrebbe voler esaminare il DDC protocol che consente di controllare gli aspetti di alcuni monitor. L'API MS che ti permette di fare questo può essere trovata qui: http://msdn.microsoft.com/en-us/library/windows/hardware/ff570290%28v=vs.85%29.aspx e dovresti guardare anche alle funzioni I2C.

In alternativa, è possibile cercare una libreria pronta per eseguire le operazioni DDC, come ad esempio http://www.nicomsoft.com/products/i2c/. Anche loro hanno un'applicazione dimmer che è gratuita per uso personale e non-free per uso commerciale. Potrebbero anche permetterti di usarlo gratuitamente se li contatti e spieghi che è per un'organizzazione senza scopo di lucro.

Se si sta tentando di farlo come un programma di risparmio energetico, perché non utilizzare un'impostazione salvaschermo che spegne il monitor dopo un certo periodo di inattività? In ogni caso

+0

Grazie per l'input. Non ho pensato di usare SetLayeredWindowAttributes() come hai descritto tu. Ma non visualizzare i pixel più scuri (più neri) richiede uno schermo per utilizzare meno energia? – c00000fd

+0

Per rispondere alla tua domanda, perché non dovrei semplicemente spegnere il monitor, abbiamo un software specializzato che emette dati che devono essere visibili sullo schermo, così ho voluto attenuare lo schermo dopo N minuti di inattività e poi se l'operatore muove il mouse tornerebbe al 100%. – c00000fd

+0

@ user843732: Potrebbe utilizzare meno energia, ma l'unico modo che si saprebbe con certezza sarebbe provarlo e misurare il consumo di energia. Cambiare l'opacità di un pixel non cambia necessariamente la luminosità della retroilluminazione, da cui proviene gran parte della potenza. Pensa a un display con la luminosità alzata e il nero che appare grigio. Molti schermi LCD hanno un unico controllo della retroilluminazione, alcuni sono segmentati ma pochi (nessuno?) Sono su base per pixel. Per quanto riguarda la tua applicazione, sembra interessante. Spero che tu possa farlo funzionare. – tinman