【问题标题】:Change keyboard locks in Python在 Python 中更改键盘锁
【发布时间】:2010-10-25 15:50:12
【问题描述】:

在 Python 中,有没有办法以编程方式更改 CAPS LOCK/NUM LOCK/SCROLL LOCK 状态?

这不是一个真正的笑话问题 - 更像是一个笑话程序的真正问题。我打算用它来让灯做一些有趣的事情......

【问题讨论】:

  • 你在什么操作系统上运行它?

标签: python windows


【解决方案1】:

在 Linux 上,这是一个 Python 程序,用于闪烁所有键盘 LED 灯:

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)

【讨论】:

  • 我现在在 Linux 上,所以我会试一试。不过,我的目标是 Windows - 应该说清楚:)
  • 不错,但需要 root 权限才能打开 /dev/console(除非设置了权限)。有什么办法让它像普通用户一样运行?
【解决方案2】:

如果您使用的是 Windows,我相信您可以使用 SendKeys

http://www.rutherfurd.net/python/sendkeys

import SendKeys

SendKeys.SendKeys("""
{CAPSLOCK}
{SCROLLOCK}
{NUMLOCK}
""")

【讨论】:

  • 它确实有用于切换数字锁定的内部代码。
  • 谢谢。我不知道 Python 有 SendKeys。
  • 有没有python 2.7的版本?在 SendKeys 网站上似乎找不到它。
  • rutherfurd sendKeys 链接现已失效,但我刚刚在此处发布了一个 Windows sendKeys 答案以查看。
  • 包在pypi中依然存在,可以使用。
【解决方案3】:

可能对 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())

【讨论】:

    【解决方案4】:

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

    import win32api,win32con
    
    def IsCapsLockOn():
        # return 1 if CAPSLOCK is ON
        return win32api.GetKeyState(win32con.VK_CAPITAL)
    

    【讨论】:

    • 如何获得 ScrollLock 和 NumLock 状态?
    • 我想通了,只是在这里添加到我的答案中。
    【解决方案5】:

    对于 Windows:

    #https://stackoverflow.com/questions/21549847/send-key-combination-with-python
    #https://msdn.microsoft.com/en-us/library/8c6yea83(v=vs.84).aspx 
    
    import win32com.client as comclt
    wsh= comclt.Dispatch("WScript.Shell")
    wsh.SendKeys("abc") #types out abc directly into wherever you have your cursor (ex: right into this editor itself!)
    
    wsh.SendKeys("{NUMLOCK}{CAPSLOCK}{SCROLLLOCK}") #toggles the state of NumLock, CapsLock, and ScrollLock; remove whichever one you don't want to toggle
    

    来源:

    1. Send key combination with python
    2. https://msdn.microsoft.com/en-us/library/8c6yea83(v=vs.84).aspx

    另外,请注意 Uri 关于如何读取 CapsLock 状态的回答。要将 LED 状态专门设置为 true 或 false,不能盲目切换,您必须首先知道当前状态是什么。他向您展示了如何读取 CapsLock 状态。以下是读取所有 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:

    还不知道所有细节,但从这里开始:Change keyboard locks in Python

    是否有适用于任何操作系统的通用 Python 模块?

    还不知道。

    相关:

    1. How to generate keyboard events in Python? - 我需要调查一下。
    2. https://pypi.org/project/keyboard/ - 看起来它需要 sudo 用于 Linux。这不好,但我需要进一步研究。
    3. 另一个仅适用于 Windows 的模块如下所示:https://pypi.org/project/SendKeys/

    【讨论】:

      【解决方案6】:

      使用这个:

      from win32api import GetKeyState
      from win32con import VK_CAPITAL
      
      GetKeyState(VK_CAPITAL)
      

      1 == 真 0 == 错误

      您也可以获得其他密钥,这里是列表:https://docs.microsoft.com/en-au/windows/win32/inputdev/virtual-key-codes

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-06
        • 2013-01-08
        • 2020-07-23
        • 2011-07-23
        • 2011-11-23
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        相关资源
        最近更新 更多