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.