Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Taste AltGr


galagher - Fr 12.03.21 20:35
Titel: Taste AltGr
Hallo!

Ich möchte die AltGr-Taste abfragen und bin einzig auf dies hier gestossen:
https://www.c-plusplus.net/forum/topic/232511/erledigt-welchen-key-code-hat-alt-gr/6

Man kann diese Taste also mit GetAsyncKeyState(165) = -32767 auswerten. ssAltGr gibt es bei Delphi nicht, bei Lazarus schon. Es ist mir nicht gelungen, ssAltGr in Delphi nachzubauen.

Also habe ich mir eine Funktion erstellt:

Delphi-Quelltext
1:
2:
3:
4:
function ssAltGr_in_Shift: Boolean;
begin
  Result := (GetAsyncKeyState(165) = -32767);
end;


Ich hätte aber gerne eine Abfrage wie

Delphi-Quelltext
1:
if (ssAltGr in Shift) then                    

Doch wie mache ich das? ssShift, ssAlt, ssCtrl sind andere Datentypen...


Th69 - Sa 13.03.21 10:31

Da TShiftState [http://docwiki.embarcadero.com/Libraries/Rio/de/System.Classes.TShiftState] ein festgelegter Datentyp ist, kann man diesen nicht erweitern.

Wenn es dir nur um die Syntax bzgl. in geht, dann erzeuge einen eigenen set-Datentyp und eine Funktion (oder analog zu Shift eine Eigenschaft) dazu.

PS: Die Abfrage bzgl. GetAsyncKeyState [https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate] ist nicht korrekt: da es sich beim Ergebnis um ein Bitfeld handelt, muß die Abfrage so lauten:

Delphi-Quelltext
1:
Result := ((GetAsyncKeyState(VK_RMENU) AND $8000) <> 0);                    


galagher - Sa 13.03.21 22:43

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es dir nur um die Syntax bzgl. in geht, dann erzeuge einen eigenen set-Datentyp und eine Funktion (oder analog zu Shift eine Eigenschaft) dazu.
Ist überlegenswert, ja!

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
PS: Die Abfrage bzgl. GetAsyncKeyState [https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate] ist nicht korrekt
Danke! Habe es jetzt so implementiert.


hRb - So 14.03.21 16:13

Hallo galagher,
ich hatte vor mal in ein Programm ins Keydown-Ereignus folgende Prozedur eingebaut, um den Tastencode anzuzeigen
(etwas abgespeckt)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
procedure KeyStatus(Key: Integer; Shift: TShiftState);
{ wertet die Tastenkombinationen der Tastatur aus: Strg, Alt Sh, etc }
var
  T: string;
  b1, b2, b3: Integer;
begin
  with Fi[FiNrAktiv] do
  begin
//    kySondZei := false;  //F-Taste
//    kyNumLook := false;  //Num-taste
//    kyCNS := false;      //CapsNumSond
//    KyPr := kpUs;
    kyShift := false;
    kyAlt := false;
    kyStrg := false;
    kyStrg2 := false;
    kyAltGr := false;
    kyStrgAlt := false;
    if GetKeyState(16and (-32768 + 128) <> 0
      then b1 := 1 else b1 := 0;
    if GetKeyState(17and (-32768 + 128) <> 0
      then b2 := 1 else b2 := 0;
    if GetKeyState(18and (-32768 + 128) <> 0
      then b3 := 1 else b3 := 0;
    if (b1 = 1and (GetKeyState(160and (-32768 + 128) <> 0then
    begin
      kyShift := True;
      T := 'Li-Shift';
    end // linke Shift
    else if (b1 = 1and (GetKeyState(161and (-32768 + 128) <> 0then
    begin
      kyShift := True;
      T := 'Re-Shift';
    end// rechte Shift
    if (b2 = 1and (GetKeyState(162and (-32768 + 128) <> 0then
    begin
      kyStrg := True;
      T := 'Li-Strg';
    end // linke STRG
    else if (b2 = 1and (GetKeyState(163and (-32768 + 128) <> 0then
    begin
      kyStrg2 := True;
      T := 'Re-Strg';
    end// rechte STRG
    if (b3 = 1and (GetKeyState(164and (-32768 + 128) <> 0then
    begin
      kyAlt := True;
      T := T + 'Alt';
    end // linke Alt
    else if (b3 = 1and (b2 = 1and (GetKeyState(165and (-32768 + 128) <> 0then
    begin
      if kyStrg = True then
      begin
        kyStrg := false;
        kyAltGr := True;
        T := 'AltGr';
      end;
    end// rechte AltGr
    if (GetKeyState(20and (-32768 + 128) <> 0then
      T := 'li-Feststell-Shift';
    if kyStrg2 = True then
      kyStrg := True;
    Form1.Statusbar1.Panels[6].Text := T + IntToStr(Key);
  end;
end;

Gruß hRb


Th69 - So 14.03.21 18:34

Was soll denn jeweils das +128? Das ist komplett überflüssig, denn nur das High ($8000) und Low Order Bit ($0001) haben eine Bedeutung: GetKeyState [https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeystate].

Und wieso fragst du nochmal die Shift, Strg und Alt-Taste ab (als b1, b2, b3), wenn der Parameter Shift: TShiftState übergeben wird (die VCL macht ja intern nichts anderes)?

Und auch die Benutzung der Virtual Key Codes [https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes] würde zur Lesbarkeit beitragen.


galagher - Mo 15.03.21 07:43

user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
ich hatte vor mal in ein Programm ins Keydown-Ereignus folgende Prozedur eingebaut, um den Tastencode anzuzeigen
Meine einfache Funktion tut's doch auch! Leider kann man AltGr nicht in TShiftState unterbringen, aber was soll's!
In dem Zusammenhang: Weiss jemand, warum es AltGr bei Delphi nicht gibt? :nixweiss: