C++ Globale Shortcuts



  • Hey.
    Ich versuche mit GetAsyncKeyState (ich weiß, nicht die schönste Methode) auf Globale Tastaturanschläge Funktionen aufzurufen.
    Am liebsten wäre es mir, wenn ich einfach eine Funtkion aufrufe á la:

    SetShortcut(MeineFunktion, VK_F12);
    

    Bis jetzt habe ich MeineFunktion als LPTHREAD_START_ROUTINE übergeben.
    Und die Funktion SetShortcut habe ich auch schon fertig:

    typedef unsigned short VKEY;
    
    struct shortcut
    {
        LPTHREAD_START_ROUTINE Function;
        VKEY Key;
        bool RunFunction;
    };
    
    HANDLE SetShortcut(LPTHREAD_START_ROUTINE Function, VKEY Key)
    {
        struct shortcut Shortcut;
        LPVOID *lpShortcut = (LPVOID*) &Shortcut;
    
        Shortcut.Function = Function;
        Shortcut.Key      = Key;
    
        return CreateThread(0, 0, DummyFunction, lpShortcut, 0, 0);
    }
    

    Das Problem das ich jetzt habe ist, dass das struct im Thread nicht ankommt (aus beispielsweise VK_F12 wird l65168). Wenn ich in der Funktion SetShortcut den LPVOID wieder in den struct zurückcaste, klappt es und der richtige Key wird ausgegeben.
    Also muss es an der übergabe des structs an den Thread liegen. Falls ihr Fragen habt, stellt sie bitte. Ich verzweifle allmhlich schon 😃

    Danke im Voraus.
    MfG DerCoder



  • Ich bin nicht sicher, ob es die Ursache für Dein Problem ist, aber ... Du übergibst Deinem Thread einen Zeiger auf eine automatische Variable, die möglicherweise schon nicht mehr existiert, wenn Du im Thread etwas damit anfangen willst.



  • Also meinst du, ich sollte mit malloc Speicher reservieren?



  • Es würde völlig genügen, die beiden Variablen Shortcut und lpShortcut jeweils als static zu deklarieren.
    Damit hast Du ihre Gültigkeit auf die Dauer des Programms ausgeweitet, und nicht mehr nur für die lokale Funktion begrenzt.

    HTH,
    Martin



  • Auf jeden Fall solltest Du irgendwie sicherstellen, daß die Variable noch gültig ist, wenn Du im Thread darauf zugreifst.
    malloc und dann im Thread free ist eine Möglichkeit, obwohl es nicht so schön ist, Speicheranforderung und Freigabe an unterschiedlichen Stellen zu haben.
    Ansonsten könnte man Shortcut global gültig machen, dann wiederum muß man sicherstellen, daß die Daten im Thread erst in eine lokale Variable kopiert werden, bevor SetShortcut im Main-Thread erneut aufgerufen wird.

    Oder so lassen wie es ist, aber die Funktion SetShortcut erst verlassen, wenn im Thread die Daten in eine lokale Variable kopiert worden sind, also eventuell auf einen Event warten.

    Ich weiß nicht, was die eleganteste Lösung ist ...



  • Okay, ich glaube ich werde die 1 Variante nehmen (Speicher vorher reservieren).
    Deinen 2. Vorschlag habe ich schon versucht, nur ich finde die Lösung nicht so gut, vorallem weil es so immer unübersichtlicher wird.
    Die Lösungen sind in der Tat nicht sehr elegant, aber mir fallen keine anderen ein.
    Vielen Dank für deine Hilfe 🙂


Anmelden zum Antworten