![]() |
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:
Pustekuchen.
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; |
AW: Shift + NumPadX erkennen
Hier ein work-around, aber happert noch hier und da, aber um Dir meinen Grundgedanken zu verdeutlichen:
Delphi-Quellcode:
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.
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; |
AW: Shift + NumPadX erkennen
Zitat:
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. |
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.
|
AW: Shift + NumPadX erkennen
Zitat:
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. |
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. |
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