Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Shift + NumPadX erkennen (https://www.delphipraxis.net/197339-shift-numpadx-erkennen.html)

KodeZwerg 31. Jul 2018 21:14

AW: Shift + NumPadX erkennen
 
Ich habe das selbe Problem mit Redeemers Vorschlag, weder per TApplicationEvents noch per TApplication, jeweils das TShortcutEvent Event, kommt dabei nur etwas positives heraus wenn numlock ausgeschaltet ist.
Ich hatte gehofft auf diese Weise beides abfangen zu können
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1ShortCut(var Msg: TWMKey;
var Handled: Boolean);
var
  ss: TShiftState;
begin
  ss := KeyDataToShiftState(Msg.KeyData);
  if ss = [ssShift] then
  begin
   if ((Msg.Charcode = VK_NUMPAD0) or (Msg.Charcode = VK_INSERT)) then // theoretisch sollte das ohne/mit numlock codes abdecken
   begin
    ShowMessage(IntToStr(Msg.CharCode));
    Handled := True;
   end;
  end;
end;
Pustekuchen.

KodeZwerg 31. Jul 2018 22:10

AW: Shift + NumPadX erkennen
 
Hier ein work-around, aber happert noch hier und da, aber um Dir meinen Grundgedanken zu verdeutlichen:
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1ShortCut(var Msg: TWMKey;
var Handled: Boolean);
  procedure SetNumLock(Active: Boolean);
  var
    State: SHORT;
    Scan: UINT;
  begin
    Scan := MapVirtualKey(VK_NUMLOCK, 0);
    State := GetKeyState(VK_NUMLOCK);
    // Prüfen ob Status nicht schon korrekt ist
    if Active xor (State and $0001 = $0001) then
     begin
       // User hat den Finger drauf :o) ( also erstmal wieder loslassen )
       if State < 0 then
        keybd_event(VK_NUMLOCK, Scan, KEYEVENTF_KEYUP, 0);
       // Taste drücken
       keybd_event(VK_NUMLOCK, Scan, 0, 0);
       // User hat nicht den Finger drauf :o) ( also loslassen )
       if State >= 0 then
        keybd_event(VK_NUMLOCK, Scan, KEYEVENTF_KEYUP, 0);
     end;
  end;
var
  ss: TShiftState;
  OrgState, KBstate: TKeyboardState;
begin
  ss := KeyDataToShiftState(Msg.KeyData);
  GetKeyboardState(KBstate);
  OrgState := KBstate;
  if ss = [ssShift] then
  begin
   if KBstate[VK_NUMLOCK] <> 0 then
    begin
      KBstate[VK_NUMLOCK] := 0;
      SetNumLock(False);
      SetKeyboardState(KBstate);
      Msg.CharCode := $0;
      Handled := True;
    end;
   if ((Msg.Charcode = VK_NUMPAD0) or (Msg.Charcode = VK_INSERT)) then
   begin
    ShowMessage('Numpad 0 + Shift: '+IntToStr(Msg.CharCode));
    Handled := True;
   end;
{   if OrgState[VK_NUMLOCK] <> 0 then
    begin
      SetKeyboardState(OrgState);
      SetNumLock(True);
      Msg.CharCode := $0;
    end;}
   if not Handled = True then if (Msg.Charcode <> VK_SHIFT) then ShowMessage(IntToStr(Msg.CharCode));
  end;
end;
Das Problem: sobald man Shift drückt wechselt NumLock An/Aus/An/Aus usw usf, also da muss noch dolle was gemacht werden, ansonsten klappt es damit ganz gut.

Amateurprofi 1. Aug 2018 11:23

AW: Shift + NumPadX erkennen
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1409254)
Meine Frage "Frage, was hast Du vor?" zielte daraufhin, welche Aufgabe mit dem Erkennen von den Tastaturdruckkombinationen erreicht werden soll. Das beim Druck von Shift+NumPad1 eben genau diese Kombination festgestellt werden soll, ist schon klar.

Habe mal ein bisserl rumprobiert:

Beim Drücken von Strg und/oder Alt plus einer NumPad-Taste bekommt man die entsprechende Info. Ob man dabei Shift betätigt oder nicht, ändert nichts am Ergebnis. Shift ist nie dabei.

Wenn man nun aber Numlock ausschaltet, dann erfährt man auch, ob Shift in der Tastenkombination plus einer NumPad-Taste dabei ist.

Meine Googlelitis brachte auch nix zum Vorschein, außer: Du bist nicht alleine mit diesem Problem.

Naja, "nicht alleine mit dem Problem".
eigentlich habe ich nicht wirklich ein Problem, denn ich habe ja eine funktionierende Lösung, die ich in #1 gezeigt habe.
Mein Ansinnen war, eine elegantere Methode aufgezeigt zu bekommen.

KodeZwerg 22. Aug 2018 21:36

AW: Shift + NumPadX erkennen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Schau mal bitte in das Projekt rein, ich habe total normale Delphi Methoden veranschaulicht und auch ein SHIFT+NumPadX lässt sich damit auslesen, egal ob NumLock on/off.

Amateurprofi 22. Aug 2018 23:50

AW: Shift + NumPadX erkennen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1411357)
Schau mal bitte in das Projekt rein, ich habe total normale Delphi Methoden veranschaulicht und auch ein SHIFT+NumPadX lässt sich damit auslesen, egal ob NumLock on/off.

Ich weiß ja nun nicht was dir angezeigt wird.
Das folgende wird mir angezeigt:
Angegeben habe ich jeweils in der ersten Zeile, die Taste die ich drücke (oder loslasse) und in der zweiten Zeile die 4 Werte die angezeigt werden.
NumPad2 Down
2 98 Leer 50
NumPad2 Up
2 98 98 50

Shift Down
2 16 98 50
NumPad1 Down
2 35 16 50
NumPad1 Up
2 16 35 50
Shift Up
2 16 16 50

Bei NumPad1 Down kommt im FormKeyDown genau das, was Probleme macht, nämlich die Information Key=35 und Shift-Taste gedrückt. Also Shift + VK_End,
Tatsächlich gedrückt war aber Shift + Numpad1.
Sehr schön ist auch zu sehen, das Shift + Numpad1 kein FormKeyPress auslöst.
Um auf die Tasten bzw. Tastenkombinationen zu reagieren bleibt also nur FormKeyDown (oder FormKeyUp) - ich bevorzuge FormShortcut.
Und da kommt bei Shift + NumpadX etwas anderes als tatsächlich gedrückt wurde.

Was ich jetzt nicht so richtig verstehe ist Dein Kommentar "und auch ein SHIFT+NumPadX lässt sich damit auslesen", denn genau das ist nicht der Fall - jedenfalls nicht bei mir.

KodeZwerg 23. Aug 2018 00:15

AW: Shift + NumPadX erkennen
 
Welch eine Schande, ich dachte echt das ich per KeyUp und KeyDown schon ganz gut liege.
Ich habe es nicht tief genug mit anderen Tasten getestet bzw total außer Acht gelassen.

Tut mir leid für Störung.

Ps:
Da stehen oftmals noch alte Werte in den Feldern, das war halt ein Schuss in den Ofen auch wenn ich das noch ausbügel mit den Feldern bleibt es falsch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr.
Seite 2 von 2     12   

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