【问题标题】:Can I turn the Capslock light on/off on individual keyboards?我可以在单个键盘上打开/关闭 Caps Lock 灯吗?
【发布时间】:2011-04-01 11:06:14
【问题描述】:

我有一台带有多个键盘的电脑,所有的大写锁定灯都同步打开/关闭。 (所以如果一个用户/键盘打开大写锁定,每个人都输入大写)

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

【问题讨论】:

    标签: windows delphi keyboard


    【解决方案1】:

    【讨论】:

    • 哇。这是很多工作。谢谢回答。这适用于XP吗?我将尝试在 delphi 中制作它并从那里修改它。
    • 是的,但你会成为忍者 :)
    • 哪一部分符合“忍者”身份?将 C 代码翻译成 Delphi,或者修改代码以在 Windows XP 中工作?如果是前者,那么您需要重新考虑您的评级系统,因为该代码非常简单。如果是后者,那么您能否描述一下 Dian 和其他人在使代码在以后的 Windows 版本中工作时会遇到的一些障碍?
    【解决方案2】:

    您可以使用 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.
    

    希望对你有帮助

    【讨论】:

    • 这不是控制灯的状态。它通过假装按下一个键来操纵操作系统的大写锁定状态。它忽略了有多个键盘的问题,每个键盘都有自己的一组灯。您可以在一个键盘上设置大写锁定,而另一个键盘则正常。
    猜你喜欢
    • 2011-08-17
    • 2016-12-18
    • 2016-12-26
    • 2014-01-16
    • 2010-12-26
    • 1970-01-01
    • 2015-08-25
    • 2014-03-02
    • 2021-02-22
    相关资源
    最近更新 更多