GetKeyState und GetAsyncKeyState
-
ich will tasten von der tastatur einlesen ohne dass das programm im vordergrund sein muss, die einzigen methoden die ich dafür gefunden hab waren GetAsyncKeyState(int) und GetKeyState(int).
ich hab diesen blog artikel gefunden,der davon abrät erstere methode zu benutzen. was haltet ihr davon?
ich hab erstmal diese for schleife, die alle tasten einliest und den keycode in konsole ausgibt:for(int i = 8; i < 191; i++) { if((ret=GetAsyncKeyState(i))&1 ==1) { cout<<i; } }
scheint sehr gut zu funktionieren, im vergleich zu dieser schleife:
for(int i=0; i<191; i++) { if((ret=GetKeyState(i))<0) cout<<char(i)<<endl; }
ein wichtiger unterschied ist, dass bei der ersten schleife die tasten genauso eingelesen und ausgegeben werden wie sie sollten, in den genau richtigen zeitabständen wie bei allen eingabefeldern in windows. wenn eine taste gedrückt gehalten wird dann ist da eine kleine verzögerung, bis dann diese taste in vernünftigen zeitabschnitten gepumpt wird.
die zweite schleife ist bei einer sleep zeit von weniger als 50ms kaum zu gebrauchen, es werden mehrere tasten eingelesen wenn man die taste ein bisschen zu lange drückt, und wenn die sleep zeit zu groß ist vermute ich dass auch der ein oder andere tastendruck übersprungen wird.was soll ich also machen? kann ich einfach GetAsyncKeyState benutzen oder hat das irgendwelche besonderen nachteile? kann man das problem bei der zweiten lösen?
ps:
beide methoden lesen bis auf die steuerzeichen nichts ein, wenn ein textfeld von MSN im vordergrund ist, bei icq ist das nicht der fall. weis jemand wieso?
-
Man erkennt sofort was Du machen möchtest...
Würde Dir empfehlen mal Grundlagen zu lernen, oder wie Du Dir Informationen beschaffst.
Hast Du die Funktionen bei MSDN schon mal angeschaut? Denn dann wäre alles klar!
Und es gibt weitaus mehr Methoden.-> Keyboard Hook - SetWindowsHookEx
-> Treiber Filter (Kbdclass)
-> NtUserGetMessage oder NtUserPeekMessage hooken
-
Wenn du das ganze in einer Console laufen lässt, kannst du diese mit
ShowWindow(GetConsoleWindow(), SW_HIDE); verstecken.Dann kann auch ein anderes Fenster aktiv sein und trotzdem erkennt dein Programm
die Tasten mit den Funktionen die du schon benutzt.Hat bei mir funktioniert, als ich einen Keylogger gebastelt habe um Tastenkürzel
abzufangen und eigene Fenster zu öffnen.Gruß
Ombre
-
Warum sollte er ein Consolen-Programmm schreiben, wenn er keine Console will... das ist doch Sinnlos...
-
arrrrghh ja sorry, bin ganz schlimm Console gewohnt. Die meisten meiner Kollegen können mit Klicki-Bunti nichts anfangen.
Es ist natürlich auch möglich das Fenster zu verstecken und mit einem bestimmten Tastenkürzel wieder aufzurufen.Also bei verlieren des Focus ShowWindow(hWnd, SW_HIDE); und wenn eine bestimmte
Tastenkombination kommt ShowWindow(hWnd, SW_SHOW);Das war von mir auch nur ein Beispiel wie es gehen könnte, ohne sich in Hooks oder ähnliches einlesen zu müssen.
Manchmal nimmt man auch eine schnelle aber dreckige Lösung, anstatt sich komplett neu einlesen zu müssen.Gruß
Ombre
-
int i=0; while(1) { Sleep(1); for(int i ; i<255 ; i++) { if(GetAsyncKeyState(i) == -32767 ) { cout<<"code: " << i << endl; } } }
Das funktioniert eigentlich ganz gut um z.b. ein Programm mit ein paar Hotkeys auszustatten.
Du könntest dir natürlich auch die MSDN Hooks anschauen hier im Forum habe ich auch schon einmal ein funktionierendes beispiel dazu gefunden.
Erste Anlaufstelle sollte aber natürlich die MSDN sein:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx