"S?en Aaholm M?ler" <swdata@image.dk> wrote in message news:<c41z7.1516$YP6.240342@news000.worldonline.dk>...
> Hejsa - jeg har fundet følgende funktion som gerne skulle henholdsvis tænde
> og slukke for Numlock. (VK_NUMLOCK skulle kunne udskiftes med VK_SCROLLLOCK
> og VK_CAPSLOCK efter behov
- men jeg synes ikke det funker... I starten
> erklærer jeg :
>
> > procedure NumLockOn;
> > procedure NumLockOn;
>
> Og længere nede har vi funktionerne :
>
> > procedure TmainFrm.NumLockOn;
> > var KeyState:TKeyboardState;
> > begin
> > GetKeyboardState(KeyState);
> > KeyState[VK_NUMLOCK]:=$01 ;
> > SetKeyboardState(KeyState);
> > end;
>
> > procedure TmainFrm.NumLockOff;
> > var KeyState:TKeyboardState;
> > begin
> > GetKeyboardState(KeyState);
> > KeyState[VK_NUMLOCK]:=$00 ;
> > SetKeyboardState(KeyState);
> > end;
>
> Jeg kalder dem med :
>
> > procedure TmainFrm.Button1Click(Sender: TObject);
> > begin
> >
> > NumLockOff;
> >
> > end;
>
> Hvorfor funker det ikke? Anyone??
Iht. MSDN virker SetKeyboardState kun for det thread hvori det bliver
kørt, men det påvirker ikke lysdioderne på tastaturet.
MS siger at man skal bruge SendInput som nærmest sender en karakter.
Eks:
uses
Windows;
procedure SetNumLock(ASet : Boolean);
var
wInput : TInput;
wCount : integer;
begin
wInput.Itype := INPUT_KEYBOARD;
wInput.ki.wVk := VK_NUMLOCK;
if ASet then begin
wInput.ki.dwFlags := 0;
end else begin
wInput.ki.dwFlags := KEYEVENTF_KEYUP;
end;
wCount := SendInput(1, wInput, Sizeof(wInput));
Assert(WCount <> 1);
end;
procedure SetCapsLock(ASet : Boolean);
var
wInput : TInput;
wCount : integer;
begin
wInput.Itype := INPUT_KEYBOARD;
wInput.ki.wVk := VK_CAPITAL;
if ASet then begin
wInput.ki.dwFlags := 0;
end else begin
wInput.ki.dwFlags := KEYEVENTF_KEYUP;
end;
wCount := SendInput(1, wInput, Sizeof(wInput));
Assert(WCount <> 1);
end;
Jeg har desværre ikke et keyboard med lysdioder (ret irriterende) men
det virkede i hvertfald i en TEdit jeg havde på formen og i andre
programmer.
/Casper