Von Programm "grauen" Button aktivieren

  • Hallo,


    heute hat mir im Geschäft einer ein schönes Tool gezeigt, mit dem man z.B. von einer Demo Version die man z.B. nur 30 Tage benutzen darf wieder aktivieren kann.


    Also das Prinzip ist so, Programm wird gestartet Meldung kommt, Sie haben noch 2 Tage übrig. Jetzt kann man Benutzen drücken und das Programm ist funktionsfähig.
    Sind die 2 Tage rum ist der Button Benutzen grau und das Programm geht nicht mehr, jetzt hat er ein Tool mit dem er in dem Fenster den Button auswählen kann und den Button wieder aktivieren kann, d.h. der Button ist nicht mehr grau sondern wieder anklickbar.


    Er meinte das funktioniert nur solange bis der Coder die Funktion von dem Button nimmt, nachdem die Demo aubgelaufen ist, also wenn er die Funktion noch auf dem Button lässt und man ihn so einfach wieder reaktiviert funktioniert wieder alles.


    Ist sowas möglich mit AutoIt, wenn ja welche Befehle brauche ich?


    Er hat es mal in C++ gecodet.

  • Einen Button grau machen funktioniert in Autoit über GUICtrlSetState($control, $state). Die States wären $GUI_DISABLE (grau) bzw. $GUI_ENABLE (anklickbar).


    Das Problem ist aber, dass das für deine gewünschte funktionsweise nicht hilfreich ist weil jeder AutoIt decompilieren kann und sich den Sourcecode eifnach so zurechtschreibt wie er es gerne hätte...


    Sicherheitsfunktionen die ein Programm uncrackbar machen in einer Interpreter Sprache zu schreiben ist witzlos...

  • WinAPI-Weg ( user32.dll )
    1. EnumWindows -> Um das Fenster-Handle zu bekommen
    2. EnumChildWindows -> Um das Handle des Controls zu bekommen
    3. EnableWindow -> Um das Control zu aktivieren


    In AutoIt gibts WinList(), aber das gibt nur die Handles aller offnen Fenster aus. AutoIt kann ja auch DLL-Calls durchführen. Das wäre sicherlich ein Weg, aber so gut ist mein AutoIt nicht.
    Vll gibts ja auch ne Funktion um die Controls eines "fremden" Fensters aufzulisten ...?


    EDIT: Jetzt hat schadowhunter mich verwirrt. Willst du ein eigenes Programm schützen oder ein solches Programm selbst schreiben?


    Gruß
    florian0

  • Genau, eigentlich habe ich nichts, ich habe es nur heute gesehen und mir geht es um die Theorie, bzw. wie kann man es machen.


    Also wie kann man bei einem fremdem Programm einen deaktivierten Button wieder aktivieren.


    Mein Arbeitskollege hat es auch mit EnumWindows gelöst. (Hier mal welche zu Programmiersprache gehört der Befehl C# oder C++?)


    Und ich wollte halt wissen, ob sowas mit AutoIT überhaupt machbar ist?

  • Einen Button aktivieren ist kinderleicht. Controlhandle rausfinden (Winhandle + ButtonID, die wohl immer gleich ist) und dann die schon erwähnte Funktion ControlSetState oder ControlEnable.


    Du kannst dann zwar den Button klicken, aber ob der seine Funktionalität auch noch hat ist halt die andere Frage.

  • EnumWindows gehört zur WinAPI und wird in der user32.dll bereitgestellt. Generell kann man EnumWindows in jeder Sprache verwenden, die die integration von DLLs zulässt.


    Edit S3cret cool das man das ControlHandle berechnen kann wusst ich noch net


    Gruß
    florian0

  • Einen Button aktivieren ist kinderleicht. Controlhandle rausfinden (Winhandle + ButtonID, die wohl immer gleich ist) und dann die schon erwähnte Funktion ControlSetState oder ControlEnable.


    Du kannst dann zwar den Button klicken, aber ob der seine Funktionalität auch noch hat ist halt die andere Frage.


    Würde quasi heißen einmal mit dem AutoIT Info Tool drüber und dann hat man schon alles was man braucht für die Funktionen?


    ...so einfach?

  • Jup. Nur für das Winhandle brauchst du halt was dynamisches, da es sich immer ändert. Wenn es einen eindeutigen Titel hat
    WinGetHandle
    Ansonsten über WinList mit Hilfe der WindowClass und anderer Eigenschaften oder des Prozesses an das Handle kommen.
    Wobei es für die Prozess-Methode keine fertige Funktion gibt. Man sich mit Hilfe von WinList und WinGetProcess aber selber eine "ProcessGetWindow" schreiben.