首页  编辑  

检测及改变num lock /caps lock

Tags: /超级猛料/Hardware.硬件相关/键盘和鼠标/   Date Created:

soaringbird:

检测:

Var

 ks: TkeyBoardState;

begin

GetKeyboardState(ks);

if (ks[VK_NUMLOCK] = 1) then

  ShowMessage('Num Lock is on.')

else

  ShowMessage('Num Lock is off.');

if (ks[VK_CAPITAL] = 1) then

  ShowMessage('Caps Lock is on.')

else

  ShowMessage('Caps Lock is off.');

end;

切换:

keybd_event( VK_NUMLOCK, $45, KEYEVENTF_EXTENDEDKEY or 0,0 );

keybd_event( VK_NUMLOCK, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);

keybd_event( VK_CAPITAL, $45, KEYEVENTF_EXTENDEDKEY or 0, 0 );

keybd_event( VK_CAPITAL, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);

var keys: TKeyboardState;

begin

{1 = on, 0 = off}

 GetKeyboardState( keys );

 keys[VK_NUMLOCK] := 1; {Num Lock}

 keys[VK_CAPITAL] := 1; {Caps Lock}

 keys[VK_SCROLL] := 1; {Scroll Lock}

 SetKeyboardState( keys );

end;

*******************************************

Question

How to control caps lock key?

Answer

A:

In Windows enviroment, you can look at the keyboard lights values, but you can't

set it, because Windows intercept your peek in the memory and blocks it (I tryed

under Windows 95, maybe under Windows 3.11 it works). However, you should be able

to look at the status.

Try to put this simple code in a function:

const

  SCROLLLOCK = 1;

  NUMLOCK    = 2;

  CAPSLOCK   = 4;

var

  Status:  Byte;

  PntK:    ^Byte;

begin

    PntK := Ptr($40, $97);        {directly point in memory}

    Status := Byte(PntK^);        {read the status}

    if (NUMLOCK and Status) = NUMLOCK then    {if NUM LOCK is on}

        Status := Status and (255 - NUMLOCK)    {turn it off}

    else

        Status := Status or 2;            {turn it on}

    Pntk^ := Status;                {poke in memory (don't works)}

end;

A:

I use this procedures to turn on the caps lock if it isn't already on when

the user enters my DBloockup combo.  This gets rid of the nasty problem

of case-sensitive indexes.

procedure TMainForm.StudentLookupEnter(Sender: TObject);

Var Level : Integer;

   KeyState : TKeyBoardState;

begin

 {check if caps-lock is on - if not turn it on}

 Level := GetKeyState(VK_CAPITAL);

 GetKeyboardState(KeyState);

 CapsLockStatus := KeyState;

 If Level = 0 then

   begin

     KeyState[VK_CAPITAL] := 1;

     setKeyboardState(KeyState);

   end;

end;

Question

I need my application to be able to "stuff keystrokes" into the keyboard

buffer.

My application needs to be able to do this while minimzed and the

keystrokes should effect the active Window and appear "typed".

Answer

A:

{this proc interrogates the numlock key and sets the state}

{according to the value of bOn}

procedure TIndexForm.ToggleNumLockKey(bOn: Boolean);

var

 KeyState : TKeyBoardState;

begin

 GetKeyboardState( KeyState );

 if bOn then KeyState[VK_NUMLOCK] := 1

    else KeyState[VK_NUMLOCK] := 0;

 SetKeyboardState( KeyState );

end;