在Python中更改键盘锁

在Python中更改键盘锁,python,windows,Python,Windows,在Python中,是否有任何方法可以通过编程更改CAPS-LOCK/NUM-LOCK/SCROLL-LOCK状态 这不是一个真正的笑话问题——更像是一个笑话节目的真正问题。我打算用它来让灯光做一些有趣的事情…如果你用的是windows,我相信你可以用它 在Linux上,有一个Python程序可以打开和关闭所有键盘指示灯: import fcntl import os import time KDSETLED = 0x4B32 SCR_LED = 0x01 NUM_LED = 0x02 C

在Python中,是否有任何方法可以通过编程更改CAPS-LOCK/NUM-LOCK/SCROLL-LOCK状态


这不是一个真正的笑话问题——更像是一个笑话节目的真正问题。我打算用它来让灯光做一些有趣的事情…

如果你用的是windows,我相信你可以用它


在Linux上,有一个Python程序可以打开和关闭所有键盘指示灯:

import fcntl
import os
import time

KDSETLED = 0x4B32
SCR_LED  = 0x01
NUM_LED  = 0x02
CAP_LED  = 0x04

console_fd = os.open('/dev/console', os.O_NOCTTY)

all_on = SCR_LED | NUM_LED | CAP_LED
all_off = 0

while 1:
    fcntl.ioctl(console_fd, KDSETLED, all_on)
    time.sleep(1)
    fcntl.ioctl(console_fd, KDSETLED, all_off)
    time.sleep(1)

要使用SendKeys将CAPS LOCK设置为特定值,必须首先检测CAPS LOCK的状态。下面是如何在python中(在windows下)执行此操作:

对于Windows: 资料来源:

  • 另外,请注意Uri关于如何读取CapsLock状态的回答。要将LED状态专门设置为true或false,您不能盲目切换,您必须首先知道当前状态是什么。他向你展示了如何解读卡普斯洛克状态。以下是如何读取所有3个LED状态:

    #https://stackoverflow.com/questions/854393/change-keyboard-locks-in-python/854442#854442abc
    #https://support.microsoft.com/en-us/kb/177674
    import win32api,win32con
    
    def isCapsLockOn():
        "return 1 if CapsLock is ON"
        return win32api.GetKeyState(win32con.VK_CAPITAL)
    
    def isNumLockOn():
        "return 1 if NumLock is ON"
        return win32api.GetKeyState(win32con.VK_NUMLOCK)
    
    def isScrollLockOn():
        "return 1 if ScrollLock is ON"
        return win32api.GetKeyState(win32con.VK_SCROLL)
    
    print("IsCapsLockOn = ", IsCapsLockOn())
    print("isNumLockOn = ", isNumLockOn())
    print("isScrollLockOn = ", isScrollLockOn())
    
    对于Linux: 还不知道所有细节,但从这里开始:

    是否有适用于任何操作系统的通用Python模块? 我还不知道

    相关的:
  • -我需要调查一下
  • -看起来Linux需要
    sudo
    。这不好,但我需要进一步调查
  • 另一个仅限Windows的模块看起来像:

  • 可能对OP毫无用处,但值得分享,因为有人可能会像我一样寻找答案,但如果不使用第三方模块,就无法找到解决方案。这就是我打开瓶盖锁所做的

    import ctypes
    
    def turn_capslock():
        dll = ctypes.WinDLL('User32.dll')
        VK_CAPITAL = 0X14
        if not dll.GetKeyState(VK_CAPITAL):
            dll.keybd_event(VK_CAPITAL, 0X3a, 0X1, 0)
            dll.keybd_event(VK_CAPITAL, 0X3a, 0X3, 0)
    
        return dll.GetKeyState(VK_CAPITAL)
    print(turn_capslock())
    
    使用以下命令:

    from win32api import GetKeyState
    from win32con import VK_CAPITAL
    
    GetKeyState(VK_CAPITAL)
    
    1==真 0==False


    您还可以获得其他按键,下面是列表:

    您运行它的操作系统是什么?它确实有内部代码,如果没有其他代码,可以切换Numlock。谢谢。我不知道Python有SendKeys。有Python2.7版本吗?在SendKeys网站上似乎找不到它。rutherfurd SendKeys链接现在已失效,但我刚刚在此处发布了一个Windows SendKeys答案以进行检查。该软件包仍然存在于pypi中,可以使用。我现在在Linux上,所以我将尝试一下。不过我的目标是Windows——应该说得很清楚:)不错,但它需要根priv才能打开/dev/console(除非设置了权限)。有什么方法可以让它作为普通用户运行吗?如何获得ScrollLock和NumLock状态?我找到了它,并将它添加到我的答案中。
    #https://stackoverflow.com/questions/854393/change-keyboard-locks-in-python/854442#854442abc
    #https://support.microsoft.com/en-us/kb/177674
    import win32api,win32con
    
    def isCapsLockOn():
        "return 1 if CapsLock is ON"
        return win32api.GetKeyState(win32con.VK_CAPITAL)
    
    def isNumLockOn():
        "return 1 if NumLock is ON"
        return win32api.GetKeyState(win32con.VK_NUMLOCK)
    
    def isScrollLockOn():
        "return 1 if ScrollLock is ON"
        return win32api.GetKeyState(win32con.VK_SCROLL)
    
    print("IsCapsLockOn = ", IsCapsLockOn())
    print("isNumLockOn = ", isNumLockOn())
    print("isScrollLockOn = ", isScrollLockOn())
    
    import ctypes
    
    def turn_capslock():
        dll = ctypes.WinDLL('User32.dll')
        VK_CAPITAL = 0X14
        if not dll.GetKeyState(VK_CAPITAL):
            dll.keybd_event(VK_CAPITAL, 0X3a, 0X1, 0)
            dll.keybd_event(VK_CAPITAL, 0X3a, 0X3, 0)
    
        return dll.GetKeyState(VK_CAPITAL)
    print(turn_capslock())
    
    from win32api import GetKeyState
    from win32con import VK_CAPITAL
    
    GetKeyState(VK_CAPITAL)