python 3检测大写锁定状态

时间:2015-12-01 19:26:54

标签: python windows python-3.3 capslock

我一直在寻找一种方法来识别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中的其他方法?非常感谢您的帮助,因为这让我疯狂。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

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

这就是诀窍。