我一直在寻找一种方法来识别Python 3中Caps Lock的状态,我发现唯一适用的是a post here in Stack Overflow answered by Abhijit声明:
可以使用ctypes加载user32.dll,然后使用nVirtKey = VK_CAPITAL(0x 14)调用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条答案
按热度按时间fykwrbwg1#
从外观上看,您的值被视为完整大小的整数。
hllDll.GetKeyState从Win32 GetKeyState函数(参见here)获取其返回值。
Windows的返回值是一个Short。您从函数返回的值是361693184,如果转换为二进制,则为1010110001111000000000000000。请注意尾部的16个0位。我猜返回值来自一个测试,而您应该得到一个0,因为它试图读取一个完整的32位int,所以前16位只是垃圾。
我将首先查看您的代码,看看为什么它可能会假设值是一个32位整数。
我希望这能帮上忙!如果这似乎不是问题所在,请在调用函数的地方发布一些代码,这样我们就可以更好地了解。
jucafojl2#
谢谢,Gimson,这确实有帮助。我能够通过调用下面的值来解决这个问题:
这就行了
mwg9r5ms3#
这是最小的工作答案,我建立在danjmwalker的答案之上
gwo2fgha4#
我会把我的帽子扔在戒指里-这里有一个答案,我发现在Windows下工作
使用pywin 32
使用ctypes
这两种解决方案本质上是相同的,但是
ctypes
版本利用了标准库。在我的测试中,当caps-lock为ON时,对
GetKeyState(VK_CAPITAL)
的调用将返回十进制-127
(0xFFFF_FFFF_FFFF_FF81
),而当caps-lock为OFF时,将返回十进制-128
(0xFFFF_FFFF_FFFF_FF80
用
& 1
屏蔽这个值有效地去除了我们不关心的所有位,只剩下十进制的1
或0
;将其传递给bool
会得到一个简单的True
或False
。请注意,在这里并不一定要使用
bool
,因为您可以很容易地检查1
或0
的真实性,但返回布尔值可能更“Python”。