1

我一直在寻找一种方法来识别 Python 3 中 CAPS LOCK 的状态,我发现唯一适用的是Stack Overflow 中的一篇帖子,由 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 的方法?非常感谢您的帮助,因为这让我发疯。

4

2 回答 2

2

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

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

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

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

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

于 2015-12-01T21:20:38.947 回答
1

谢谢,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")

这可以解决问题。

于 2015-12-01T22:57:15.940 回答