Entwickler-Ecke
Windows API - Alternative zu GetAsyncKeyState / OnKeyDown
P@u1 - Mo 01.02.10 20:18
Titel: Alternative zu GetAsyncKeyState / OnKeyDown
Hi,
ich möchte bei einem Programm von mir machen, dass die Escape-Taste etwas auslöst.
Da das auch klappen soll, wenn die Form nicht im Vordergrund ist, geht soweit ich weiß OnKeyDown schonmal nicht.
Jetzt hab ich das im Moment mit GetAsyncKeyState gemacht, aber irgendwie scheint mir das sehr unzuverlässig zu sein, manchmal funktioniert es nicht (könnte auch an der Timer-Prozedur liegen, aber glaube das liegt am Befehl).
Gibt es eine andere Möglichkeit oder wisst ihr, wie ich die Verwendung von GetAsyncKeyState optimieren kann?
Vielen Dank für eure Hilfe!
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Mo 01.02.2010 um 20:03
SAiBOT - Mo 01.02.10 22:02
Die einzig saubere Lösung dafür ist wohl ein
KEYBOARDHOOK.
P@u1 - Mo 01.02.10 22:45
das mit den keyboardhooks ist aber soweit ich weiß ziemlich kompliziert (mit ini und so).
Wieso funktioniert GetAsyncKeyState denn manchmal nicht?
ALF - Mo 01.02.10 22:57
Hi,
kann auch am Timer liegen, wie hast Du ihn eingestellt?
oder
Poste doch mal Deine GetAsyncKeyState Abfrage
Gruss ALf
P@u1 - Mo 01.02.10 23:20
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TfrmMain.Timer1Timer(Sender: TObject); var i: Integer; begin if GetAsyncKeyState(VK_ESCAPE)=1 then begin if Button2.Caption='Stop' then Button2Click(Button2); exit; end;
... |
hier besser die =1 durch >0 ersetzen, oder?
Ist mir gerade so aufgefallen, glaube aber nicht das das das problem war, das dürfte ja nur probleme geben, wenn man mehr als 1 mal escape drückt während der timer läuft.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TfrmMain.Button2Click(Sender: TObject); begin GetAsyncKeyState(VK_ESCAPE); activ:=not(activ); if activ then begin Timer1.Enabled:=true; Button2.Caption:='Stop' end else begin Timer1.Enabled:=false; Button2.Caption:='Start'; end; end; |
Anmerkung: GetAsnycKeyState steht nochmal in Button 2 drin, weil dieser auch den timer aktiviert und dadurch dann sicher gestellt wird, dass erst ab aktivierung des timers escape drück gezählt wird.
ALF - Mo 01.02.10 23:34
Hi,
Delphi-Quelltext
1:
| if GetAsyncKeyState(VK_ESCAPE) <> 0 then |
Delphi-Quelltext
1: 2: 3:
| procedure TfrmMain.Button2Click(Sender: TObject); begin GetAsyncKeyState(VK_ESCAPE); |
ich weis was Du damit willst, funct aber nicht immer!
Beziehungsweise:
fragt GetAsyncKeyState ob die Taste vor dem Aufruf gedrückt war, Ergebnis = 0, oder während der Abfrage von GetAsyncKeyState, Ergebnis <>0.
P@u1
| Zitat: |
| GetAsnycKeyState steht nochmal in Button 2 drin, weil dieser auch den timer aktiviert |
nein, macht es nicht weil Du kein boolean an irgend was übergibts oder abfragst!? :wink:
Warum machst Du exit im Timer? Dort solltest Du den Timer stoppen!
Gruss Alf
P@u1 - Di 02.02.10 00:04
Hilfe sagt:
| Zitat: |
The GetAsyncKeyState function determines whether a key is up or down at the time the function is called, and whether the key was pressed after a previous call to GetAsyncKeyState.
|
oder zählt
Delphi-Quelltext
1:
| GetAsyncKeyState(VK_ESCAPE); |
nicht als call?
Zählt das nur als Call, wenn ich einer variable den Wert zuweise?
Edit:
irgendwie hab ich das hier nicht ganz verstanden:
| Zitat: |
Beziehungsweise:
fragt GetAsyncKeyState ob die Taste vor dem Aufruf gedrückt war, Ergebnis = 0, oder während der Abfrage von GetAsyncKeyState, Ergebnis <>0.
|
edit2:
der timer wird (indirekt) durch den aufruf von button2click gestoppt. aber der durchlauf selbst soll nicht mehr durchgeführt werden, deswegen steht dahinter exit. Ansonste würde er diesen durchlauf soweit ich weiß noch zuende machen (korrigiert mich, falls das nicht stimmt^^)
vielen dank für die hilfe btw
ALF - Di 02.02.10 00:16
sorry: was verwechselt :oops:
| Zitat: |
Null, wenn die Taste nicht gedrückt ist.
Ungleich Null, wenn die Taste gedrückt ist, wobei das minderwertigste Bit (LSB) gesetzt ist, wenn die Taste erst nach dem letzten Aufruf von GetAsyncKeyState gedrückt wurde |
Aber in Button2click fragst du trotzdem nichts ab :wink:
Delphi-Quelltext
1:
| GetAsyncKeyState(VK_ESCAPE); |
zählt als call, aber Du fragst nicht ab!
also kann GetAsyncKeyState auch nicht den timer auslösen! würde auch nur funcen wenn zur gleichen Zeit esc gedrückt wäre.
kannst du also rausnehmen.
P@u1
| Zitat: |
| aber der durchlauf selbst soll nicht mehr durchgeführt werden |
Der Timer läuft solange bis er gestoppt wird! :wink:
exit ist richtig, aber nur einmal wenn GetAsyncKeyState <>0 ist!
ansonsten läuft er weiter!
Edit:Sorry sollte Feierabend machen :lol:
exit ist natürlich richtig, wie Du es hast im Timer!
Hab Dein Buttonclick aufruf übersehen :oops:
Gruss ALf
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!