GetAsyncKeyState und Funktionstasten



  • Hallo,

    Ich hab eine Frage zu 'GetAsyncKeyState' in Verwendung mit Funktionstasten(F1, F2, F3..).
    Und zwar soll ein Code ausgeführt werden, wenn F5 betätigt wurde, und eine Schleife durch erneutes Drücken nicht begonnen werden.

    if(GetAsyncKeyState(VK_F5))
                 {
                 // Code
    
                 while(!GetAsyncKeyState(VK_F5))
                     {
                     // noch mehr Code
                     }
                 }
    

    Leider wird 'noch mehr Code' nie ausgeführt.
    Wenn ich die GetAsyncKeyState-Funktionen auf normale Buchstaben umschreibe, gehts.
    Ich hab auch versucht noch ein GetAsyncKeyState(VK_F5) unterzubringen, um irgendein erneutes Drücken abzufangen, aber vergebens.
    Was hat es damit aufsich?

    Gruß



  • Eine andere Möglichkeit wäre.

    if(GetAsyncKeyState(VK_F5))
                 {
                     // Code
                 }
          else
              {
                      // noch mehr Code
              }
    

    Aber die wird wahrscheinlich dir nicht zu sagen,...nehm ich mal an.

    €dit: Fehler...

    Lg Mentras



  • Mentras schrieb:

    Dann wird nämlich der ganze Ausdruck verneint.

    Und was ist deiner Meinung nach vorher passiert?

    EDIT: Also dieses Minimalbeispiel nach deinem Vorbild funktioniert tadellos:

    #include <Windows.h>
    #include <iostream>
    
    using namespace std;
    
    int main(void) { 
    	for(;;) {
    		if(GetAsyncKeyState(VK_F5)) 
    		{ 
    			cout << "F5 pressed" << endl;
    
    			while(!GetAsyncKeyState(VK_F5)) 
    			{
    				cout << "mehr Code..." << endl;
    				// noch mehr Code 
    			} 
    		}
    	}
    }
    

    Ich würde mal vermuten, dass du noch nicht mal in die erste if-Verzweigung kommst...



  • War wohl falsch,... nagut.

    Danke!

    Lg Mentras



  • Mein Minimalbeispiel sah sehr ähnlich aus:

    #include <windows.h>
    #include <iostream>
    
    int main()
    {
    	while(1)
    	{
    		if(GetAsyncKeyState(VK_F5) & 1)
    		{
    			while(!(GetAsyncKeyState(VK_F5) & 1))
    			{
    				std::cout << "       inner Loop\n";
    				Sleep(1000);
    			}
    		}
    		std::cout << "outer Loop\n";
    		//Sleep(1000);
    	}
    }
    

    Ich hatte allerdings das Problem, daß ohne den oben auskommentierten Sleep mein Programm auch die if-Abfrage nicht überwand. Mit aktiviertem Sleep funktionierte es einwandfrei.
    Erst nachdem ich den Test so wie oben (ver-and-en mit 1) geändert hatte, lief es auch so, wie es soll. 😕



  • Nach ein paar weiteren Tests glaube ich, daß das Programm einfach so schnell läuft, daß beim zweiten GetAsyncKeyState (in der while-Schleife) die Taste als immer noch gedrückt erkannt wird. Durch das ver-and-en mit 1 erreicht man, daß festgestellt wird, ob die Taste nach dem letzten GetAsyncKeyState - Aufruf erneut gedrückt wurde ---> das funktioniert.



  • Belli schrieb:

    Nach ein paar weiteren Tests glaube ich, daß das Programm einfach so schnell läuft, daß beim zweiten GetAsyncKeyState (in der while-Schleife) die Taste als immer noch gedrückt erkannt wird. Durch das ver-and-en mit 1 erreicht man, daß festgestellt wird, ob die Taste nach dem letzten GetAsyncKeyState - Aufruf erneut gedrückt wurde ---> das funktioniert.

    Genau, stimmt. Vielleicht sollte man einfach mal die Doku lesen. 🤡

    MS schrieb:

    Although the least significant bit of the return value indicates whether the key has been pressed since the last query [...]

    Bei mir hat es wohl nur geklappt, weil ich so unheimlich flinke Finger habe... 😉



  • _matze schrieb:

    Bei mir hat es wohl nur geklappt, weil ich so unheimlich flinke Finger habe... 😉

    Ich schätze, bei Dir hat es geklappt, weil Deine Ausgabe zwischen den beiden Aufrufen war ... 😉



  • Belli schrieb:

    _matze schrieb:

    Bei mir hat es wohl nur geklappt, weil ich so unheimlich flinke Finger habe... 😉

    Ich schätze, bei Dir hat es geklappt, weil Deine Ausgabe zwischen den beiden Aufrufen war ... 😉

    Hehe, oder so. Ich bevorzuge aber die Variante, in der ich einfach viel schneller als alle anderen bin. 😃



  • Alles klar..
    Nach 30 mal hinschaun hab ich bemerkt, dass ich GetAsyncKeyState('VK_F5') geschrieben hab.
    Mich wundert aber, dass ich bei den anderen Funktionen nie einen Sleep-Befehl gebraucht hab.
    Danke für die Antworten.



  • Tastendruecker schrieb:

    Alles klar..
    Nach 30 mal hinschaun hab ich bemerkt, dass ich GetAsyncKeyState('VK_F5') geschrieben hab.

    Hehe, deswegen ist es sehr sinnvoll, hier auch wirklich den Code zu posten, den man auszuführen versucht (Stichwort C&P)...



  • Tastendruecker schrieb:

    Mich wundert aber, dass ich bei den anderen Funktionen nie einen Sleep-Befehl gebraucht hab.

    Das hab ich doch geschrieben, wenn Du es richtig machst, brauchst Du kein Sleep!



  • Belli schrieb:

    Tastendruecker schrieb:

    Mich wundert aber, dass ich bei den anderen Funktionen nie einen Sleep-Befehl gebraucht hab.

    Das hab ich doch geschrieben, wenn Du es richtig machst, brauchst Du kein Sleep!

    Ich hab jetzt schon alles durch und es kommen jedesmal andere Variationen..



  • Tastendruecker schrieb:

    Ich hab jetzt schon alles durch und es kommen jedesmal andere Variationen..

    Dann machst du jedesmal was anders... :p


Anmelden zum Antworten