Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Shift + NumPadX erkennen

  Alt 31. Jul 2018, 23:10
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.
Gruß vom KodeZwerg

Geändert von KodeZwerg (31. Jul 2018 um 23:19 Uhr)
  Mit Zitat antworten Zitat