【问题标题】:python 3 detect caps lock statuspython 3检测大写锁定状态
【发布时间】:2015-12-01 19:26:54
【问题描述】:

我一直在寻找一种方法来识别 Python 3 中 CAPS LOCK 的状态,我发现唯一适用的是 a post here in Stack Overflow answered by Abhijit 声明:

您可以使用 ctypes 加载 user32.dll,然后使用 nVirtKey = VK_CAPITAL (0x14) 调用 GetKeyState

def get_capslock_state():
    import ctypes
    hllDll = ctypes.WinDLL ("User32.dll")
    VK_CAPITAL = 0x14
    return hllDll.GetKeyState(VK_CAPITAL)

我已将此应用于我的脚本,但返回的值不是预期的 1/0,而是一个从不重复的长 9 数字序列。我不确定如何使用此值返回 1/0、T/F 或任何要测试的真实值。

任何想法,无论是基于 Abhijit 的评论还是其他适用于 Python 3 的方法?非常感谢您的帮助,因为这让我发疯了。

【问题讨论】:

  • 它返回的长序列是什么?您使用的是什么操作系统?
  • 该脚本当然是在 Windows 上运行的(因此是 WinDLL)。我正在运行 Windows 7 企业版,如果它有所作为的话。
  • 对于返回的值,它总是在改变数字序列,但它总是9个字符长。上次运行的示例是“361693184”。
  • 嗯,这很奇怪。当您使用 VK_NUMLOCK = 0x90VK_SCROLL = 0x91 作为参数时会发生什么?您是否得到了正确的结果,或者您是否与使用 VK_CAPITAL 时类似的垃圾? (参见GetKeyState WinAPI docs

标签: python windows python-3.3 capslock


【解决方案1】:

从外观上看,您的值被视为一个完整大小的整数。

hllDll.GetKeyState 从 here 中看到的 Win32 GetKeyState 函数获取其返回值。

Windows 的返回值是一个 Short。该函数的返回值为 361693184,如果转换为二进制,则为 10101100011110000000000000000。请注意尾随的 16 个 0 位。我猜返回值来自一个你应该得到一个 0 的测试,并且因为它试图读取一个完整的 32 位 int,所以前 16 位只是垃圾。

我将首先查看您的代码,看看为什么它可能会假设该值是一个 32 位整数。鸭子打字的乐趣:)

我希望这会有所帮助!如果这似乎不是问题,请在调用该函数的位置发布一些代码,以便我们更好地查看。

【讨论】:

    【解决方案2】:

    谢谢,Gimson,这确实有帮助。我可以通过调用以下值来解决这个问题:

    def CAPSLOCK_STATE():
        import ctypes
        hllDll = ctypes.WinDLL ("User32.dll")
        VK_CAPITAL = 0x14
        return hllDll.GetKeyState(VK_CAPITAL)
    
    CAPSLOCK = CAPSLOCK_STATE()
    if ((CAPSLOCK) & 0xffff) != 0:
        print("\nWARNING:  CAPS LOCK IS ENABLED!\n")
    

    这就是诀窍。

    【讨论】:

    • 不要在函数中加载DLL。每次您这样做时,它都会调用 WinAPI LoadLibrary 并毫无意义地增加加载程序在 DLL 上的引用计数。将其设为名为 user32 的全局变量或类变量。
    • 设置为user32 = ctypes.WinDLL('user32');user32.GetKeyState.restype = ctypes.c_short。现在您不需要屏蔽结果了。
    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 2011-07-19
    • 1970-01-01
    • 2016-06-15
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多