Autor Beitrag
P@u1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: Mo 01.02.10 20:18 
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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 01.02.2010 um 20:03
SAiBOT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 323
Erhaltene Danke: 6

XP SP2; 7
D7; D2009
BeitragVerfasst: Mo 01.02.10 22:02 
Die einzig saubere Lösung dafür ist wohl ein Suche in: Delphi-Forum KEYBOARDHOOK.

_________________
Debuggers don't remove bugs, they only show them in slow-motion.
P@u1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
P@u1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: Mo 01.02.10 23:20 
ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Mo 01.02.10 23:34 
Hi,
ausblenden Delphi-Quelltext
1:
if GetAsyncKeyState(VK_ESCAPE) <> 0 then					

ausblenden 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.user profile iconP@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

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!


Zuletzt bearbeitet von ALF am Di 02.02.10 00:35, insgesamt 2-mal bearbeitet
P@u1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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:
ausblenden 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.

user profile iconP@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

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!