Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Tastenkombination Ctrl+K+P erkennen (https://www.delphipraxis.net/103996-tastenkombination-ctrl-k-p-erkennen.html)

taaktaak 25. Nov 2007 22:00


Tastenkombination Ctrl+K+P erkennen
 
Moin, Moin,
benötige mal einen Denkanstoß wie man z.B. das oben genannte Tastenkürzel erkennen kann. Ctrl+K ist ja klar, aber wie komme ich dann innerhalb des Events an den zweiten Buchstaben. In Turbo-Pascal genügte ein zweites ReadKey (oder so ähnlich, ist verdammt lange her) oder ein direkter Zugriff auf den Tastaturpuffer. Den müsste es doch heute eigentlich auch noch geben! Oder?
Gruß Ralph

mirage228 25. Nov 2007 22:12

Re: Tastenkombination Ctrl+K+P erkennen
 
Hey,

Also in Delphi kannst Du dir ja mal die Komponente Delphi-Referenz durchsuchenTHotkey anschauen. Ggf. lässt sich ja damit dein gewünschter Hotkey realisieren.

mfG
mirage228

taaktaak 25. Nov 2007 22:32

Re: Tastenkombination Ctrl+K+P erkennen
 
Hmm, also das ist wohl nicht das was ich suche. Abgesehen davon, dass ich nicht verstehe, wieso das eine optisch sichtbare Komponente ist, :spin2: können hiermit offenbar Kürzel wie Ctrl+K+P nicht erkannt werden. Hat noch jemand anders eine Idee?
Gruß Ralph

taaktaak 25. Nov 2007 22:58

Re: Tastenkombination Ctrl+K+P erkennen
 
So, Antwort selbst gefunden.

Mein Ansatz mit dem Tastaturpuffer war schon 'ne gute Idee. Lösung nachstehend, falls es mal ein Anderer gebrauchen kann - Maus hin, Maus her, manchmal geht es mit der Tastatur einfach schneller...

Delphi-Quellcode:
procedure ~~.FormKeyDown(~~~~);
var KeybState : TKeyboardState
begin

  GetKeyboardState(KeybState);  // in Unit Windows deklariert

  if (KeybState[VK_Control] and 128=128) and        // Ctrl
     (KeybState[ord('K')]  and 128=128) and        // K
     (KeybState[ord('P')]  and 128=128) then begin // P
    ...
    ..
    .
    end;
end;
Ach ja, darauf achten, dass Großbuchstaben für die Indizierung des Arrays verwendet werden, mit Kleinbuchstaben (also z.B. ord('k') funktioniert's nicht.

Gute Nacht aus Hamburg
Ralph

Muetze1 25. Nov 2007 23:40

Re: Tastenkombination Ctrl+K+P erkennen
 
Bei der Lösung sollte aber ein CTRL-P K das gleiche bewirken. Dein Code achtet damit nicht auf die Reihenfolge der Tastendrücke. Auch würde der Code funktionieren, wenn alle 3 Tasten gedrückt sind. Aber im Normalfall werden diese Wordstar Tastenkommandos nacheinander eingetippt, also CTRL-K und danach das P. Siehe auch CTRL-K B, CTRL-K K, CTRL-K C, CTRL-K V, CTRL-K X, etc.

/EDIT: Habe gerade am Threadtitel gesehen, dass es nicht dein Ziel ist Wordstar Kommandos nachzuahmen sondern wirklich alle drei Tasten gleichzeitig drücken. Damit ist der Hinweis dann natürlich hinfällig. Ich frage mich nur noch, ob billige Tastatur(en/matrix) diese drei Tasten auch gleichzeitig unterstützen, vor allem weil zwei nicht Umschalttasten beteiligt sind...

taaktaak 26. Nov 2007 00:04

Re: Tastenkombination Ctrl+K+P erkennen
 
Hallo Thomas,

man sollte vor dem Schlafengehen nicht mehr ins Forum schauen :stupid: Also das hat mich jetzt nicht ruhen lassen. Es sollte natürlich ausgeschlossen sein, dass Ctrl-P K als identisch mit Ctrl-K P erkannt wird. Die Gleichzeitigkeit ist nach meiner Einschätzung als relativ zu betrachten: Habe das mal an mir selbst ausgetestet. Es fällt einem im Eifer des Eintippens nicht wirklich auf, ob man die beiden ersten (also Ctrl und K) beide schon losgelassen hat, wenn der dritte Buchstabe gedrückt wird. Habe jetzt folgende Lösung, die mir etwas absonderlich erscheint. Aber sieh selbst...

Delphi-Quellcode:
procedure TfoTest9.FormKeyDown(Sender:TObject;var Key:Word;Shift:TShiftState);
var KeybState : TKeyboardState;
begin
  if SSCtrl in Shift then
    if Key=ord('P') then begin
      GetKeyboardState(KeybState);
      if KeybState[ord('K')] and 128=128 then begin
        sm('Ctrl+K P'); // << ShowMessage für Tippfaule
        //...
        //..
        //.
        end;
      end;
end;
Zuerst hatte ich es (natürlich?!) in anderer Reihenfolge (Test auf K und dann auf P) - aber nur so funktioniert es?! In dieser Version wird nur Ctrl+K+P erkannt, nicht Ctrl+P+K. Die Gleichzeitigkeit (ich sagte es schon) erscheint mir unwichtig!

Vielen Dank für den Hinweis!
Gute Nacht aus Hamburg
Ralph

Hansa 26. Nov 2007 00:17

Re: Tastenkombination Ctrl+K+P erkennen
 
Zitat:

Zitat von taaktaak
... in anderer Reihenfolge (Test auf K und dann auf P) - aber nur so funktioniert es?! In dieser Version wird nur Ctrl+K+P erkannt, nicht Ctrl+P+K. Die Gleichzeitigkeit (ich sagte es schon) erscheint mir unwichtig!

Hier wird einiges übersehen ! ^K ist ein einzelner "Buchstabe". Für ^P gilt dasselbe. Soll ^K oder ^P keinen Unterschied machen, dann sorge ich mich ernsthaft um das zugrunde liegende Programm. :mrgreen:

Ansonsten gilt in Delphi : die Ctrl-Zeichen im OnKeyDown auswerten und alles danach im OnKeyPress. 8)

taaktaak 26. Nov 2007 00:25

Re: Tastenkombination Ctrl+K+P erkennen
 
Moin Hansa - keine Sorge ist derzeit nur eine Spielerei!
Habe aufgrund deines Hinweises feststellen müssen dass es nun mit ^K und ^P nicht mehr so recht funktionieren will. Aber selbst Delphi reagiert ja auf Ctr+K+P (wenn alle 3 Tasten gleichzeitig gedrückt werden) Es muss also eine saubere Lösung geben. Meine ist es offensichtlich noch nicht.
So, nun aber wirklich ins Bett!
Gute Nacht
Ralph

taaktaak 26. Nov 2007 00:47

Re: Tastenkombination Ctrl+K+P erkennen
 
Oh shit, für 'ne Spielerei ist es jetzt schon ziemlich spät geworden.

Hansa, deine Sorgen um mein Programm kann ich eigentlich nicht mehr ganz nachvollziehen. Folgender Code zeigt, dass ^K und ^P sauber erkannt werden und auch Ctrl+K+P, nicht aber Ctrl+P+K.

Delphi-Quellcode:
procedure TfoTest9.FormKeyDown(Sender:TObject;var Key:Word;Shift:TShiftState);
var KeybState : TKeyboardState;
begin
  if SSCtrl in Shift then begin

    if Key=ord('P') then begin
      GetKeyboardState(KeybState);
      if KeybState[ord('K')] and 128=128 then label1.caption:='Ctrl+K+P'
                                         else label1.caption:='Ctrl P';
      end;

    if Key=ord('K') then label1.caption:='Ctrl K';

    end;

end;
Problem ist, dass jedes Ctrl+K+P für einen kurzen Zeitraum auch ein Ctrl+K ist - aber ist das nicht auch mit einem DoppelClick so, der ist für eine in Windows definierte Zeitspanne auch erst einmal ein einfacher Click. Optimierung wäre also in diesem "Tastaturfall", ebenfalls eine Zeitspanne zu definieren, innnerhalb derer der zweite Buchstabe gedrückt werden muss, um als 3er-Kombination gewertet zu werden.

Oder habe ich dich völlig missverstanden?
Ralph


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz