Autor Beitrag
Fränk
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 16.09.08 19:24 
Hallo, ich habe folgendes Problem:
Ich habe ein Programm, welches permanent klickt (Delphi läuft praktisch im Hintergrund weiter), wie müsste ich das Programm umschreiben, damit ich bei drücken einer Taste auf der Tastatur das Programm beenden kann, obwohl dies nur im Hintergrund läuft? (Delphi 7)
<TargeT>
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 59

Win XP, Win 98
Delphi 7
BeitragVerfasst: Di 16.09.08 19:51 
guck mal hier www.delphi-library.d...rarbeiten_19371.html
das ist genau das richtige für dich;)
Fränk Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 16.09.08 21:02 
Das Problem ist, dass sich das Programm in einer Endlosschleife befindet, da das Klicken mit einer While-Schleife geschrieben ist. Bedeutet, dass wenn man das Programm "normal" beenden will keine Rückmeldung stattfindet und man schließlich das Programm doch manuel schließen muss.
optikandy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Di 16.09.08 21:12 
Das hielft dir bestimmt weiter...

Tutorial: Tastatureingaben global abfangen und simulieren

Teil I: Tastatureingaben global abfangen

Wenn man Tastatureingaben global (also ohne dass die eigene Anwendung im Vordergrund läuft) lediglich auswerten, aber nicht manipulieren will, funktioniert dass ganz einfach mit
ausblenden Delphi-Quelltext
1:
if GetAsyncKeyState(VK_TASTE) < 0 then TuIrgendWas;					

Die VK_* - Codes findet ihr in der Delphi-Hilfe (Einfach irgendeinen VK_* - Eintrag auswählen).
Wenn die Eingabe kontinuierlich abgefragt werden soll, verwendet man am besten einen Timer (eine Endlosschleife frisst Unmengen an Resourcen):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if GetAsyncKeyState(VK_TASTE) < 0 then TuIrgendWas;
end;

und setzt "Interval" auf eine Zahl kleiner 20.
Wenn die Eingaben manipuliert werden sollen, muss man allerdings den weit komplizierteren Weg über Hooks nehmen (Davon gibt's in dieser Kategorie ein Tutorial).

Teil II: Tastatureingaben global simulieren

Das simulieren eines Tastendrucks funktioniert recht einfach mit
ausblenden Delphi-Quelltext
1:
2:
keybd_event(VK_TASTE, Scancode, 00); //Status: Gedrückt
keybd_event(VK_TASTE, Scancode, KEYEVENTF_KEYUP, 0); //Status: Normal

Die erste Zeile drückt hier die Taste, die zweite lässt sie wieder los.
Um einen ganzen String "einzutippen", verwentet man am besten diese Methode:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure SendKeyString(KStr: String);
var
  Scan: SHORT;
  key: Byte;
  i: Integer;
begin
  for i := 0 to length(KStr) do begin
    key := Byte(Kstr[i]);
    Scan := MapVirtualKey(key, 0);
    keybd_event(key, Scan, 00);
    keybd_event(key, Scan, KEYEVENTF_KEYUP, 0);
  end;
end;

Um nur ein einziges Zeichen zu senden, diese:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure SendKeyPress(KChar: Char);
var
  Scan: SHORT;
  key: Byte;
begin
    key := Byte(KChar);
    Scan := MapVirtualKey(key, 0);
    keybd_event(key, Scan, 00); //Status: Gedrückt
    keybd_event(key, Scan, KEYEVENTF_KEYUP, 0); //Status: Normal
end;

Dabei ist zu beachten, dass der String bzw. das Zeichen ausschließlich aus Tatsächlich vorhandenen Tasten bestehen darf: Beispielsweise ist "H" und "4" eine Taste, "z" und "@" aber keine!

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Timosch
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Di 16.09.08 21:20 
Threads verwenden. Ein Programm sollte niemals so laufen, dass es nicht mehr auf Ereignisse reagiert.

Optikandy: Nächstes Mal bitte auf das Tutorial verlinken, oder wenigstens Delphi-Tags verwenden.

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
optikandy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 17.09.08 22:45 
ja sry, aber ich habe die seite nicht mehr gefunden, und hatte das tutorial für mich auf dem pc gespeichert...

da ich dem armen mann helfen wollte, habe ich es ihm dann gerade so geschickt...

sry :flehan: