2012-08-11 12 views
10

He estado buscando atenuar una pantalla en una plataforma de Windows de mi programa. Sé que hay una API SetMonitorBrightness que permite esto, pero el problema para mí es que sería bueno poder atenuar la pantalla en Windows XP también (que esa API no es compatible) y también pantallas oscuras en las computadoras de escritorio.Dim la pantalla en Windows con C++

Así que hice un poco de investigación y encontré this utility que parece atenuar mi pantalla en un escritorio con Windows XP sin ningún problema. Traté de contactar al autor para averiguar cómo implementaron el atenuador, pero no tuve noticias suyas.

Tengo curiosidad por saber de los desarrolladores en este sitio, ¿cómo crees que lograron atenuar la pantalla cuando la API SetMonitorBrightness no es compatible?

PS. Soy un desarrollador novato tratando de escribir un programa de ahorro de energía para nuestra pequeña empresa. Es una organización sin fines de lucro y no tenemos fondos para contratar a un desarrollador de Windows para que lo haga por nosotros. La mayoría de nuestras computadoras son computadoras de escritorio con Windows XP, así que como pueden ver, no puedo usar la API SetMonitorBrightness, ya que está ampliamente documentada en la web.

Gracias de antemano.

Respuesta

3

Perdónenme si esta información está desactualizada, pero lo hice en el pasado usando SetDeviceGammaRamp. La versión 'Obtener' está disponible también para guardar y restaurar el estado. Lo he visto usar en los programas de C#, por lo que podría ser relevante aunque ya no sea demasiado común.

+0

Muy buena adición. ¡Gracias! Necesito probarlo. Mi única preocupación es que la descripción de API dice: "No todas las tarjetas de video en color directas admiten rampas gamma cargables". – c00000fd

4

En el caso que usted cite, eche un vistazo al protector de pantalla con Dependancy Walker. Supongo que crean una ventana de pantalla completa y usan SetLayeredWindowAttributes() para establecer una configuración semi opaca para la ventana, lo que hace que la pantalla aparezca atenuada. Dudo que te ahorre mucho dinero.

Es posible que desee consultar el DDC protocol que le permite controlar aspectos de algunos monitores. La API de MS que le permite hacer esto se puede encontrar en la siguiente rotonda: http://msdn.microsoft.com/en-us/library/windows/hardware/ff570290%28v=vs.85%29.aspx y también debe ver las funciones de I2C.

Alternativamente, podría buscar una biblioteca preparada para hacer las cosas DDC para usted, como http://www.nicomsoft.com/products/i2c/. Ellos también tienen una aplicación de dimmer que es gratuita para uso personal y no libre para uso comercial. Incluso pueden permitirte usarlo gratis si te contactas con ellos y explicas que es para una organización sin fines de lucro.

Si está intentando hacer esto como un programa de ahorro de energía, ¿por qué no utilizar un ajuste de protector de pantalla que apaga el monitor después de un cierto período de inactividad? En cualquier caso

+0

Gracias por su aporte. No pensé en utilizar SetLayeredWindowAttributes() como describiste. Pero, ¿no mostrar los píxeles más oscuros requeriría una pantalla para usar menos energía? – c00000fd

+0

Para responder a su pregunta, ¿por qué no debería apagar el monitor, tenemos un software especializado que genera datos que deben estar visibles en la pantalla, por lo que quería atenuar la pantalla después de N minutos de inactividad y luego si el operador mueve el mouse, volverá al 100%. – c00000fd

+0

@ user843732: Puede que consuma menos energía, pero la única manera de que lo sepa con certeza sería probarlo y medir el consumo de energía. Cambiar la opacidad de un píxel no cambia necesariamente el brillo de la luz de fondo, que es de donde proviene la mayor parte de la energía. Piense en una pantalla con el brillo subido y los negros aparecen grises. Muchas pantallas LCD solo tienen un único control de brillo de luz de fondo, algunas están segmentadas pero pocas (¿ninguna?) Están basadas en píxeles. En cuanto a tu aplicación, suena interesante. Espero que lo hagas funcionar. – tinman

Cuestiones relacionadas