LuxDimmer : gérer simplement la luminosité de l’écran

Depuis plus d’un an, le blog n’était plus mis à jour, alors que j’étais sur un projet passionnant (R.I.P.E.R.). J’ai dû mettre ces activités en suspend pour le boulot : j’avais une certif à préparer et ça m’a demandé beaucoup de temps (CEH).

Fraîchement certifié, me revoilà ! Dès le début de mes révisions, j’ai été confronté à un problème : la lecture de centaines de pages de cours sur l’écran, ça fatigue. Et devoir constamment modifier les réglages de luminosité sur l’écran, c’est toujours contraignant, surtout si on doit le faire plusieurs fois dans la journée. A noter que sur un ordinateur portable, cela ne pose pas de problème car Windows permet de modifier directement la luminosité de l’écran. Sur un écran fixe, c’est une toute autre histoire.

J’ai testé différents logiciels, comme f.lux qui semble une référence dans le genre (il permet d’ajuster la luminosité/colorimétrie de l’écran en fonction de l’heure du jour). Mais finalement, pas moyen de trouver un logiciel simple (et pas gavé de spy/ad-wares), qui permet de modifier la luminosité de l’écran à un instant T avec un simple curseur.

Je m’y suis donc collé. C’est très simple, le logiciel se lance et se place dans la barre des tâches. En cliquant sur son icone, un menu s’affiche permettant de modifier la luminosité des écrans connectés au PC. Voilà ce que ça donne :

Je me suis vite aperçu qu’il n’était pas possible de modifier directement la luminosité de Windows quand l’écran est « externe » (et non intégré à un portable). L’astuce consiste tout simplement à ajouter un calque qui se superpose au bureau et reste tout le temps au premier plan sans empêcher la souris d’accéder aux éléments graphiques sous-jacents. Il suffit ensuite de faire varier l’opacité de ce calque pour diminuer la luminosité 🙂

Voici le bout de code magique qui permet de gérer la « transparence pour les clics de souris » :

public static class WindowsServices
{
    const int WS_EX_TRANSPARENT = 0x00000020;
    const int GWL_EXSTYLE = (-20);

    [DllImport("user32.dll")]
    static extern int GetWindowLong(IntPtr hwnd, int index);

    [DllImport("user32.dll")]
    static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);

    public static void SetWindowExTransparent(IntPtr hwnd)
    {
        var extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
        SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);
    }
}

J’ai déposé les sources sur Github, si jamais ça intéresse du monde, l’exécutable est directement disponible également ici.