Autor Beitrag
henny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 126



BeitragVerfasst: Di 16.06.09 17:14 
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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 16.06.09 17:22 
Global oder nur wenn dein Programm aktiviert ist?

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 16.06.09 17:25 
Wenn es global sein soll: Schonmal Hotkey in die Suche eingetippt?

_________________
PROGRAMMER: A device for converting coffee into software.
henny Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 126



BeitragVerfasst: Mi 17.06.09 16:00 
Nur wnn mein Programm aktiviert ist!
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mi 17.06.09 17:27 
Das kannst du ganz simpel mit OnKeyPress machen, außerdem geht auch noch GetASyncKeyState.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Mi 17.06.09 17:52 
Hast du ein Menü? Wenn ja, dann kannst du es zu jedem Menüpunkt direkt eingeben.

_________________
Popov
henny Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 126



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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:

ausblenden 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.

ausblenden 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;

_________________
Popov
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Sa 20.06.09 13:42 
Also so habe ich es mal in meinem Pong gemacht:
ausblenden 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.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
henny Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 126



BeitragVerfasst: 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?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 20.06.09 14:38 
Dann schau mal unter OnKeyDown.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Di 07.07.09 17:25 
hat du leider:

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

also:

ausblenden 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

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Critter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: 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.

_________________
Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)


Zuletzt bearbeitet von Critter am Di 07.07.09 17:45, insgesamt 1-mal bearbeitet