我可以在各个键盘上打开/关闭Caps Lock指示灯吗?

时间:2010-08-20 02:28:01

标签: windows delphi keyboard

我有一台带有多个键盘的电脑,所有的大写灯都会同步打开/关闭。 (因此,如果一个用户/键盘打开了大写字母,那么每个人都会输入大写字母)

我正在考虑将每个键盘的大写锁定状态保存在标志中但我只是意识到每个用户/键盘的大写锁定状态灯都不对应。
我只是想知道封锁灯是否可以独立打开/关闭。我已经计划禁用大写锁(因为我不太喜欢那个键),但是如果客户想要使用它,我可以找到一种方法来做或告诉他们这是不可能的。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

您可以使用Keybd_Event函数以编程方式获取和设置CapsLock键的状态 试试这个:

var
    KeyState: TKeyboardState;
 begin
    GetKeyboardState(KeyState) ;
   if (KeyState[VK_CAPITAL] = 0) then
    begin  //simulate key down
      Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or 0, 0) ;
      Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0) ;
    end
    else
    begin  //simulate key up
      Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or 0, 0) ;
      Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0) ;
    end;

如果您真的想要禁用密钥(我不推荐),您可以使用名为BlockKeys的库(我在http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21504230.html找到了BlockKeys库):

library BlockKeys;

uses
  Windows,
  Messages;

{$R *.RES}

var
hKeyHook: THandle = 0;
Hooked: Boolean = False;

function HookFunc(Code, VirtualKey, KeyStroke: Integer): Integer; stdcall;
begin
if  VirtualKey in [VK_TAB, VK_CONTROL, VK_MENU, VK_ESCAPE, VK_F1] then
  Result := 32
  else
  Result := CallNextHookEx(hKeyHook, Code, VirtualKey, KeyStroke);
end;


function StartHook: Boolean; export;
begin
Result := False;
if Hooked then
  begin
  Result := True;
  Exit;
  end;

hKeyHook := SetWindowsHookEx(WH_KEYBOARD, HookFunc, hInstance, 0);
if hKeyHook <> 0 then
  begin
  Result := True;
  Hooked := True;
  end;
end;


function StopHook: Boolean; export;
begin
if Hooked then
  Result := UnhookWindowsHookEx(hKeyHook)
  else
  Result := True;
if Result then Hooked := False;
end;

exports
  StartHook,
  StopHook;

begin

end.

希望这会有所帮助