Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Wie programmiert man einen hotkey?


henny - Di 16.06.09 17:14
Titel: Wie programmiert man einen hotkey?
Wie programmiere ich einen hotkey so das wenn man eine bestimmte Tastenkombination auf der Tastatur eingibt, das irgendwas durchgefürt wird.

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


Dude566 - Di 16.06.09 17:22

Global oder nur wenn dein Programm aktiviert ist?


Xentar - Di 16.06.09 17:25

Wenn es global sein soll: Schonmal Hotkey in die Suche eingetippt?


henny - Mi 17.06.09 16:00

Nur wnn mein Programm aktiviert ist!


Dude566 - Mi 17.06.09 17:27

Das kannst du ganz simpel mit OnKeyPress machen, außerdem geht auch noch GetASyncKeyState.


Popov - Mi 17.06.09 17:52

Hast du ein Menü? Wenn ja, dann kannst du es zu jedem Menüpunkt direkt eingeben.


henny - Sa 20.06.09 13:26

und wie programmiere ich dann das in OnKeyPress wenn man eine Tastenkombination drückt
z.B. eine showmessage erscheint?


Popov - Sa 20.06.09 13:41

Nichts dagegen, daß du fragst, aber die Art wie du das machst ist irgendwie zum ignorieren. Du kommst irgendwie so rüber als ob die anderen es für dich programmieren sollten. Du fragst - wie programmiere ich das? Hier fehlt das Gefühl, daß du es selbst versucht hast und es nicht klappt und du deshalb fragst.

Wenn du die OnKeyPress Prozedur durch klicken im Objektinspektor erstellst, dann erstellt Delphi automatisch diese Prozedur:


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin

end;


Geht es noch einfacher? Was für Parameter hast du da? Wie wäre es mit Key? Was könnten wir damit anfangen? Es ist ein Char-Typ. Was glaubst du was uns Delphi über den Parameter übergibt? Nochmal zur Erinnerung, das Ereignis ist OnKeyPress. Genau, die Taste die gedrückt wurde.


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = 'a' then ShowMessage('Noch einfacher geht es nicht.');
end;


Dude566 - Sa 20.06.09 13:42

Also so habe ich es mal in meinem Pong gemacht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if GetAsyncKeyState(VK_UP) <> 0 then 
    ShowMessage('Hoch');

  if GetAsyncKeyState(VK_Down) <> 0 then
    ShowMessage('Runter');
end;


Den Timer dann dementsprechend einstellen wie intensiv er nachmisst, wenn du z.B. ein Intervall von 2 hast dann schaut er in dem moment wo du drückst so oft nach, dass die ShowMessage mehrfach ausgegeben wird.


henny - Sa 20.06.09 14:28

Danke "dovov" das hat geklappt und wie mache ich das wenn ich nicht nur a drücke sonern strg+a?


Delete - Sa 20.06.09 14:38

Dann schau mal unter OnKeyDown.


ffgorcky - Mo 06.07.09 20:51

Also, wenn Du solche Tastenkombinationen (mit Alt oder Strg) als HotKeys haben möchtest, dann ließe sich das wirklich am einfachsten - und zumindest für mich auch am übersichtlichsten - mit (evtl. versteckten) MainMenü-Einträgen machen.
Man braucht ja gar nicht sehen, dass das Programm solch ein MainMenu besitzt (indem Du einfach alle Eintäge auf Visible:=false setzt), aber so klappt das!


elundril - Mo 06.07.09 21:09

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Man braucht ja gar nicht sehen, dass das Programm solch ein MainMenu besitzt (indem Du einfach alle Eintäge auf Visible:=false setzt), aber so klappt das!


is aber schlechter programmierstil ;) und es verbraucht mehr speicherplatz im ram, so wie jede eigentlich sichtbare komponente.

lg elundril


ffgorcky - Di 07.07.09 14:28

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
is aber schlechter programmierstil ;) und es verbraucht mehr speicherplatz im ram, so wie jede eigentlich sichtbare komponente.


Na gut, dann müsstest Du nach meinen jetzigen Informationen das ganze dann einfach so machen, dass Du Dir bei FormKeyDown merkst, welche Taste gerade gedrückt wurde (also so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if not gedrueckteTaste=nil then //oder none? - die beiden Begriffe bekomme ich immer wieder durcheinander...
   gedrueckteTaste:=Key;
end;
)
und natürlich bei FormKeyUp dann das ganze wieder so machst:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key=gedrueckteTaste then
   gedrueckteTaste:=nil//oder none? - die beiden Begriffe bekomme ich immer wieder durcheinander...
end;

Und wenn Du bei OnKeyDown noch eine zweite Taste sendest, dann könnte es ja die richtige sein:

Delphi-Quelltext
1:
2:
if gedrueckteTaste=VK_CTRL and Key='a' then
   ShowMessage('Richtige Tastenkombination!');


Ich hoffe nur, dass ich mich da jetzt nicht irgendwo vertan habe...


elundril - Di 07.07.09 17:25

hat du leider:

man könnte mit TShiftState arbeiten. ich denkte da sollte ssCrtl dabei sein.

also:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = Ord('a'and (ssCtrl in Shift) then 
    machDasWasGemachtWerdenSoll;
end;


lg elundril


Critter - Di 07.07.09 17:43

Hallo,

ich denke die Interessanteste Möglichkeit so etwas unter Delphi zu machen liegt in einer ActionList. Einfach eine AL auf das Formular und doppelt Klicken dann eine neue Aktion hinzufügen, unter Hotkey im Objektinspektor deine Tastenkombination eintragen und doppelt auf die Action in der Liste Klicken um aus zu Programmieren, was bei ihrem auslösen geschehen soll.

Das schöne ist, dass du bei bedarf auch gleich die Actions an Menüpunkte und Buttons hängen kannst, wo diese dann mit Caption, Icon (sofern du eine Imagelist hinterlegt hast) und auch der Anzeige des HotKeys erscheinen. Als Sahnehäubchen kannst du dann alle Menüs und Buttons die mit einer Action verknüpft sind auf einen Schlag Disablen oder Unsichtbar machen - einfacher geht das nun wirklich nicht mehr.

Ich sicher du findest zu dem Thema auch was in Suche in: Delphi-Library DER LIB.