Unchecky, Ninite, comment ca marche ?

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, depuis quelques temps, je me pose cette question: comment Unchecky (un petit logiciel qui permet de de décocher les cases d’installation de logiciels indésirables pendant l’installation de programmes légitimes) fait t-il pour accéder à l’interface d’un autre soft ? Programmatiquement je veux dire.

Accessoirement, même si c’est un peu différent, je me demande comment fait Ninite pour installer les logiciels sans lancer leur interfaces graphiques… Pour certains programme comme Firefox, je suppose qu’ils télécharge l’exécutable puis le lance en appelant les paramètres adéquats, mais j’ai du mal à croire que cela puisse être le cas avec tous les softs proposé par Ninite. J’ai du mal à concevoir que ceux qui maintiennent le programme dé-compilent chaque binaire afin d’obtenir le comportement voulu.

Malgré mes recherches je ne trouve rien.

Je serais ravi d’avoir quelques réponses si vous en avez.

+0 -0

Hello!

Si le système d’exploitation utilisé est Windows, je gage que Unchecky utilise des API comme FindWindow pour récupérer un handle (Un descripteur d’objet sous Windows, si tu préfères) vers la fenêtre de l’installeur et ensuite utiliser, je dirais, SendMessage pour envoyer un message à la fenêtre de l’installeur et lui indiquer de décocher la case. Là, dans les détails, je ne sais pas trop comment récupérer la checkbox.

Du point de vue de Windows, si mes souvenirs sont exacts, tout est "Window". Un bouton est un "Window", donc je dirais que c’est la même chose pour les cases à cocher. Peut-être existe-t-il des API pour récupérer les "Window" enfants d’un Window parent ? Auquel cas Unchecky réussit peut-être de cette manière à récupérer la checkbox et à lui envoyer le message pour lui dire "décoche-toi".

Honnêtement, ce thread vaut bien une tribune. J’essaie de faire ça à l’occasion, ça peut être marrant.

OK, j’ai un jet. Je ne suis pas sûr du tout que ça fonctionne sur ton programme cible, mais en tout cas il fonctionne dans le mien (je détaillerai toute ma démarche dans une tribune) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <windows.h>

#define MAX_BUF     255


BOOL CALLBACK TargetWindowEnumChildProc(HWND hwnd, LPARAM lParam);

int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    PWSTR pCmdLine,
    int nCmdShow)
{
    HWND hTargetWindow = FindWindow(
        NULL,
        TEXT("Toggle my Checkbox (please)"));

    if (hTargetWindow == NULL) {
        MessageBox(
            NULL,
            TEXT("Could not find the target window. "
                 "Maybe you should launch it?"),
            TEXT("OooOops!"),
            MB_OK | MB_ICONWARNING
        );
        ExitProcess(-1);
    }

    EnumChildWindows(
        hTargetWindow,
        TargetWindowEnumChildProc,
        0);

    return 0;
}

BOOL CALLBACK TargetWindowEnumChildProc(HWND hwnd, LPARAM lParam) {
    CHAR cClassName[MAX_BUF] = {'\0'}; // Hope this is enough...
    LONG lWindowStyle = 0;

    GetClassName(hwnd, cClassName, MAX_BUF - 1);

    if (strcmp(cClassName, "Button") == 0) {
        // It's a match! Check that it is a checkbox

        lWindowStyle = GetWindowLong(hwnd, GWL_STYLE);

        if (lWindowStyle & BS_CHECKBOX) {
            // It is a checkbox: uncheck it. :D
            SendMessage(
                hwnd,
                BM_SETCHECK,
                BST_UNCHECKED,
                0);

            MessageBox(
                NULL,
                TEXT("I have unchecked this unwanted damn checkbox!"),
                TEXT("Rock'n'roll!"),
                MB_OK | MB_ICONINFORMATION
            );
        }
    }

    return TRUE;
}

Tiens-nous au jus éventuellement. :)

Édité par Ge0

Avec plaisir ! :) Ton interrogation m’a tellement motivé que j’ai un peu foncé tête baissé et ai oublié de répondre à l’autre partie de ton message :

Accessoirement, même si c’est un peu différent, je me demande comment fait Ninite pour installer les logiciels sans lancer leur interfaces graphiques…

Nogs

Je pense qu’il est question de jouer sur le paramètre nCmdShow de WinMain :

nCmdShow is a flag that says whether the main application window will be minimized, maximized, or shown normally.

J’ai l’impression que cette partie de la doc n’est pas très complète. En effet, si tu regardes la doc de la fonction ShowWindow, tu vois que l’argument nCmdShow peut prendre plusieurs valeurs, dont SW_HIDE. Il est possible de fournir ce paramètre via la fonction CreateProcess. Je pense qu’ils s’y prennent de la sorte. :)

Auteur du sujet

Histoire de continuer mes investigations, j’ai jeté un œil à Framapack qui propose un service ressemblant à celui de Ninite. Il semblerais que Framapack installe les programmes en leur passant en paramètre un "silent-install" après avoir téléchargé leur dernière version. Mais au vu du faible nombre de logiciels que Ninite-comptabibles (je veux dire par rapport au nombre de logiciels dipo sous Windows), cela ne m’entonnerais pas qu’il n’installe que les logiciels qui acceptent de ce paramètre.

+0 -0

cela ne m’entonnerais pas qu’il n’installe que les logiciels qui acceptent de ce paramètre.

Nogs

Tout à fait. Si tu fournis l’option SW_HIDE à un installeur qui ne supporte pas d’option d’installation silencieuse (comme si tu avais l’assistant avec les fenêtres), alors tu vas lancer l’installeur fenêtré mais qui sera caché, alors qu’il attendra les inputs de l’utilisateur. Ce qui n’a aucun intérêt en somme.

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte