C++ Macro... Schleife beendet sich nur hin und wieder!



  • Hallo..
    Hätte eine Frage zu meinem Programm!
    Ich will ein Macro machn welches mir mit Numlock aktiviert wird &
    wenn ich dann di maustaste drücke & halte sollte es die ganze zeit für mich klicken! Funktioniert auch... nur die Abfrage ob die Maustaste gedrückt worden ist funktioniert nur hin und wieder!
    Also wollt ich fragen wie ich dies am besten lösen könnte das es einwandfrei funktioniert. Mit anderer Taste (z.B. STRG) geht es perfekt nur Maustaste wär halt noch besser 🙂

    #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
    #define KEY_UP  (vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
    
    void Macro::startThread() {
        boolean f12 = false;
        boolean numlock = false;
        int i = 1;
        while (!f12) {
    
            if (KEY_DOWN(VK_F12)) {
                f12 = true;
            }
    
            if (KEY_DOWN(VK_NUMLOCK)) {
                i++;
                if (i % 2 == 0) {
                    numlock = true;
                } else {
                    numlock = false;
                }
                Sleep(2500);
            }
    
            if (numlock) {
                if (KEY_DOWN(VK_LBUTTON)) {
                    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
                    Sleep(25);
                    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                    Sleep(50);     
                } else {
                    Sleep(25);
                }
            } else {
                Sleep(25);
            }
        }
    }
    


  • Willkommen am C++-Board!
    Zunächst mal kannst du die Funktion, ob die Maustaste gedrückt wurde, GetAsyncKeyState überlassen (bei jedem Schleifendurchgang prüfen).
    Und zudem bist du im falschen Forum. Ein Moderator wird dich nach WinAPI verschieben.



  • Lass mich mal raten: die Maustaste funktioniert nur jedes zweite Mal..? Im Code

    if (i % 2 == 0) {
                    numlock = true;
                }
    

    setzt du numlock nur wenn i durch 2 (ohne Rest) teilbar ist, d.h. mouse_event() wird nur nach jedem zweiten Numlock abgeschickt. Du könntest versuchen diese if-Überprüfung ganz wegzulassen und stattdessen den KEY_UP -Event von VK_NUMLOCK abzufangen und an der Stelle

    numlock = false;
    

    zu setzen.



  • danke für die schnellen antworten... 🙂
    Das Numlock ist in dem fall unabhängig zu der Funktion was di Mausausübt!
    Numlock ist rein dazu da ob er jz darauf achten soll ob er auf mausklicks mit dem mausevent reagiern soll oder eben nicht!

    Am anfang ist numlock ja false und i = 1;
    Wenn er jz in der schleife Numlock drückt ist eben i=2 und das ergebnis mit % 2 ergibt 0 also setzt er numlock true...
    Sleep(2500) ist deswegen damit er nicht in dera zeit wo ich numlock drücke noch ein paar mal das i raufzählt...

    Erst dann überprüft er ob was mit der Maustaste geschieht!
    Wenn ich dann eben die Maustaste drücke dann dann soll er die maus_events starten... nur er erkennt nicht immer wenn ich die Maustaste loslasse manchmal eben schon manchmal eben nicht... das is halt nervig 😉



  • rothii schrieb:

    nur er erkennt nicht immer wenn ich die Maustaste loslasse manchmal eben schon manchmal eben nicht... das is halt nervig 😉

    1. Das sollte er eigentlich gar nicht erkennen, weil du das nicht implementiert hast (nirgendwo im Code steht KEY_UP(VK_LBUTTON) .

    2. Wenn er bei deinem Gedrückt-Halten der Maustaste die Maustaste die ganze Zeit betätigen soll, musst du das mit einer while-Schleife machen. Könnte dann so aussehen:

    while (KEY_DOWN(VK_LBUTTON)) { 
    	...
    }
    

    3. So, wie du den Code im Moment stehen hast, sollte er das alles mit der Maus auch nicht immer mitmachen, sondern nur nach jedem zweiten Drücken der NUMLOCK-Taste.

    rothii schrieb:

    Am anfang ist numlock ja false und i = 1;
    Wenn er jz in der schleife Numlock drückt ist eben i=2 und das ergebnis mit % 2 ergibt 0 also setzt er numlock true...

    Was heißt das denn? Nach dem ersten Drücken der NUMLOCK-Taste funktioniert das alles. Nach dem zweiten nicht. Nach dem dritten funktionierts's wieder .....

    Ich würde also das Ganze so schreiben (bin mir aber nicht sicher ob's problemlos kompiliert wird):

    void Macro::startThread() {
        boolean f12 = false;
        boolean numlock = false;
        int i = 1;
        while (!f12) {
    
            if (KEY_DOWN(VK_F12)) {
                f12 = true;
            }
    
            if (KEY_DOWN(VK_NUMLOCK)) {
                i++;
                if (i % 2 == 0) {
                    numlock = true;
                } else {
                    numlock = false;
                }
                Sleep(2500);
            }
            else if (KEY_UP(VK_NUMLOCK)) {
                i++; //oder numlock = true;
            }
    
            if (numlock) {
                while (KEY_DOWN(VK_LBUTTON)) {
                    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
                    Sleep(25);
                    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                    Sleep(50);    
                }
            } else {
                Sleep(25);
            }
        }
    }
    

    Grüße
    Rewind.



  • Es soll ja nach dem Zweiten drücken Numlock nicht mehr funktioniern... das ist eben zum ein und ausschalten des Macros F12 beended die Schleife komplett!

    while (KEY_DOWN(VK_LBUTTON)) {
                    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
                    Sleep(25);
                    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                    Sleep(50);    
                }
    

    Den code hab ich auch schon mal gehabt :)! ist im prinzip ja eh as gleiche was ich hab nur das ich keine doppelte schleife drin hab... die schleife läuft ja sowieso durch und wenn der LBUTTON down is dann geht er ins if gleich wie bei deiner schleife...
    Ich denke da das problem ist hauptsächlich das dieses zum schluss aufgerufen wird:

    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    

    Und wenn ich die taste loslasse das Programm nicht schnell genug zum reagiern ist bzw. vll sollt ich irgendwo noch ein LEFTUP reinhaun....???



  • Warum ein Makro? Ne Funktion ist für sowas besser geeignet.



  • Dein Gebastel mit der Num-Lock Taste sieht auch reichlich instabil aus. Wenn du Pech hast, drückt der Nutzer mehrfach innerhalb der 2 1/2 Sekunden Pause auf die Num-Taste und du verpasst den zweiten Tastendruck - oder er hält die Taste lange genug fest, daß du trotzdem zwei Tastendrücke registrierst.
    Wenn du etwas aussagekräftigeres benötigst, schau dir mal die GetKeyState() an - die verrät dir auch, ob eine Feststelltaste eingeschaltet ist.

    314159265358979 schrieb:

    Warum ein Makro? Ne Funktion ist für sowas besser geeignet.

    Ich glaube, hier geht es nicht um Makros im Sinne des Präprozessors



  • @CStoll: guck mal in den ersten Beitrag

    #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 
    #define KEY_UP  (vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
    

    Ich würde das schon "im Sinne des Präprozessors" nennen 😉
    (Zusätzlich geht es wohl auch um anderen Makros, aber das ist wieder ne andere Sache)



  • Warum als Makro?
    Sowas verpackt man in C++ als inline Funktion. Makros im Header können echt fies sein ...



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • hustbaer schrieb:

    @CStoll: guck mal in den ersten Beitrag

    #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 
    #define KEY_UP  (vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
    

    Das habe ich eher als Mittel zum Zweck angesehen und nicht als das Kernproblem des Beitrags. Aber ich warte lieber auf eine etwas präzisere Beschreibung des Problems 😉



  • Natürlich ist das nicht das "Kernproblem", trotzdem wäre eine Funktion hier besser geeignet.
    Nichts anderes hat 314159265358979 angemerkt, und du hast darauf geantwortet "ich glaube, hier geht es nicht um Makros im Sinne des Präprozessors".
    -> 😕



  • Es ist schwer zu sagen woran es liegt. An deiner Stelle würde ich für GetAsyncKeyState nicht die Maustaste nehmen (zumindest nicht die linke), sondern was anderes. Und probier's einafach mit if (GetAsyncKeyState(VK_LBUTTON) &1) { statt des Umwegs über die Makros.



  • weiss nicht wie ich mein problem noch genauer beschreiben soll^^...

    Das makro soll wenn ich eine taste drücke(am besten die linke maustaste) die ganze zeit die linke maustaste drücken!

    Mein problem damit ist das das programm nicht immer mitbekommt das ich die maustaste loslasse... es funktioniert einfach nicht jedes mal! Meine frage ist ganz einfach ob ich hier die Abfrage besser machen könnte bzw. eine andere schleife oder keine ahnung was...

    Es geht eigentlich rein um diese Zeile alles andere funktioniert wie ich es gebrauche...

    if (KEY_DOWN(VK_LBUTTON)) {
                    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
                    Sleep(25);
                    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                    Sleep(50);    
                }
    

    Wie schon gesagt wenn ich Beispielsweise

    if (KEY_DOWN(VK_CONTROL))
    

    nehme funktioniert das klicken einwandfrei und er registriert auch wenn ich die Control taste loslasse..
    Nur eben möchte ich gern das diese Funktion auch einwandfrei mit der Maus funktioniert:)

    hoffe konnte jz alles beschreiben^^



  • rothii schrieb:

    Das makro soll wenn ich eine taste drücke(am besten die linke maustaste) die ganze zeit die linke maustaste drücken!

    Wozu willst du genau die Aktion simulieren, die diese Simulation auslösen soll?
    Vermutlich bringst du mit deinen mouse_event()-Aufrufen die GetAsyncKeyState()-Funktion durcheinander. Wenn der Nutzer während des ersten Sleep() die Maustaste loslässt, ist die letzte Aktion die das System sieht, der simulierte Tastendruck - und folglich denkt es, daß die Taste noch/wieder gedrückt ist.



  • Ja das das mouse_event das ganze durcheinander bringt dachte ich mir eh... gibt es vll eine möglichkeit simulierte klicks von echten klicks zu unterscheiden?


Log in to reply