Linke/rechte - Ctrl/Shift Taste

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Linke/rechte - Ctrl/Shift Taste

Beitrag von Mathias »

Gibt es mit der LCL auch eine Möglichkeit zu ermitteln, ob Shift/Ctrl Links oder Rechts gedrückt wurde ?
Damit kommt nur 16 oder 17 rein.

Code: Alles auswählen

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  WriteLn(key);    
Es gibt da noch den Shift-Status, aber da gibt es auch keine Unterschied zwischen Links und Rechts.
Lazarus-Sourcen:

Code: Alles auswählen

{ Types used by standard events }
  TShiftStateEnum = (ssShift, ssAlt, ssCtrl,
    ssLeft, ssRight, ssMiddle, ssDouble,
    // Extra additions
    ssMeta, ssSuper, ssHyper, ssAltGr, ssCaps, ssNum,
    ssScroll,ssTriple,ssQuad,ssExtra1,ssExtra2); 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Linke/rechte - Ctrl/Shift Taste

Beitrag von siro »

Hallo Mathias,
ich habe grad mal "gegraben" mein altes Turbo Pascal und hänge Dir mal die uralte Unit von mir ran.
Vielleicht kann Du damit etwas anfangen....
Dateianhänge
KB.PAS
(20.87 KiB) 47-mal heruntergeladen
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Linke/rechte - Ctrl/Shift Taste

Beitrag von theo »

Unterscheiden kann man die beiden Tasten so:

Code: Alles auswählen

TForm1 = class(TForm)
  private
    procedure LMKeyDown(var Message: TLMKeyDown); message LM_KEYDOWN;    
...
procedure TForm1.LMKeyDown(var Message: TLMKeyDown);
begin
  writeln(HiWord(Message.KeyData).ToHexString);
end;    
Aber welcher Code was bedeutet, weiss ich momentan auch nicht.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Linke/rechte - Ctrl/Shift Taste

Beitrag von Mathias »

ich habe grad mal "gegraben" mein altes Turbo Pascal und hänge Dir mal die uralte Unit von mir ran.
Das gute alte Turbo-Pascal.
So wie ich gesehen, habe, kann du nur die beiden Shift-Tasten unterscheiden. Bei Ctrl, hast du nur eine.

Bei X11 mit dem ich mich momentan beschäftige, kommt alles bei jedem Tastendruck rein. Dies ist alles im Event-Schlüssel enthalten.
Unterscheiden kann man die beiden Tasten so:
Echt spannende Funktion.
Ich habe mal das HiWord rausgenommen, so das ich alles sehe was rein kommt.

Code: Alles auswählen

  writeln(Message.KeyData.ToHexString);
Komischerweise kommt nicht alles rein.
Folgende getestete Tasten versagen. Alt, AltGr, Tab, Enter, Pfeiltasten.
PrtSc und Windows-Tasten gehen auch nicht, die werden schon vom System abgefangen.
Alles andere geht, auch Exoten wie Pause, NumLock, ScrollLock.

Weis einer das komische verhalten von Tab, Enter, etc. ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Linke/rechte - Ctrl/Shift Taste

Beitrag von theo »

Mathias hat geschrieben:
Do 24. Nov 2022, 13:15
Weis einer das komische verhalten von Tab, Enter, etc. ?
Die siehst du mit:

Code: Alles auswählen

procedure LMKeyUp(var Message: TLMKeyUp); message LM_KEYUP;            

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Linke/rechte - Ctrl/Shift Taste

Beitrag von Mathias »

Komisch, das dies nur bei KeyUp kommt.
Was steckt da für ein Grund dahinter ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Linke/rechte - Ctrl/Shift Taste

Beitrag von Mathias »

Folgende getestete Tasten versagen. Alt, AltGr, Tab, Enter, Pfeiltasten.
Ich bin jetzt noch eine Stufe tiefer gegangen. Auch da reagrieren diese ominösen Tasten nicht.

Code: Alles auswählen

  TForm1 = class(TForm)
  protected
    procedure WndProc(var TheMessage: TLMessage); override;
  end;
....
procedure TForm1.WndProc(var TheMessage: TLMessage);
begin
  if TheMessage.Msg = LM_KEYDOWN then begin
    WriteLn('down');
  end;
  if TheMessage.Msg = LM_KEYUP then begin
    WriteLn('up');
  end;
  inherited WndProc(TheMessage);
end;
Ich sehe da keine Logik dahinter.
Kann mir einer den Grund erklären, wieso dies so ist ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Linke/rechte - Ctrl/Shift Taste

Beitrag von theo »

Ich weiss es nicht. Vielleicht filtert GTK das raus oder die LCL.
X11 ist es jedenfalls nicht direkt, das kannst du mal mit "xev" auf der Shell testen.
https://www.commandlinux.com/man-page/man1/xev.1.html

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Linke/rechte - Ctrl/Shift Taste

Beitrag von Mathias »

Bei X11 kommt alle.

Danke für das Cool Tool.

Da sind noch die Sourcen dazu: https://github.com/freedesktop/xev
Die sind recht interessant.
Die habe von mir gerade ein * bekommen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten