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



  • 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?


Anmelden zum Antworten