Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 12.03.21 20:35 
Hallo!

Ich möchte die AltGr-Taste abfragen und bin einzig auf dies hier gestossen:
www.c-plusplus.net/f...ey-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:
ausblenden 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
ausblenden Delphi-Quelltext
1:
if (ssAltGr in Shift) then					

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

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 13.03.21 10:31 
Da 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 ist nicht korrekt: da es sich beim Ergebnis um ein Bitfeld handelt, muß die Abfrage so lauten:
ausblenden Delphi-Quelltext
1:
Result := ((GetAsyncKeyState(VK_RMENU) AND $8000) <> 0);					

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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 ist nicht korrekt
Danke! Habe es jetzt so implementiert.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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)
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.

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 würde zur Lesbarkeit beitragen.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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:

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!