windows python 3检测大写锁定状态

2mbi3lxu  于 2023-04-13  发布在  Windows
关注(0)|答案(4)|浏览(238)

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

fykwrbwg

fykwrbwg1#

从外观上看,您的值被视为完整大小的整数。
hllDll.GetKeyState从Win32 GetKeyState函数(参见here)获取其返回值。
Windows的返回值是一个Short。您从函数返回的值是361693184,如果转换为二进制,则为1010110001111000000000000000。请注意尾部的16个0位。我猜返回值来自一个测试,而您应该得到一个0,因为它试图读取一个完整的32位int,所以前16位只是垃圾。
我将首先查看您的代码,看看为什么它可能会假设值是一个32位整数。
我希望这能帮上忙!如果这似乎不是问题所在,请在调用函数的地方发布一些代码,这样我们就可以更好地了解。

jucafojl

jucafojl2#

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

这就行了

mwg9r5ms

mwg9r5ms3#

这是最小的工作答案,我建立在danjmwalker的答案之上

import ctypes

def is_capslock_on():
    return True if ctypes.WinDLL("User32.dll").GetKeyState(0x14) else False

print(is_capslock_on())
gwo2fgha

gwo2fgha4#

我会把我的帽子扔在戒指里-这里有一个答案,我发现在Windows下工作

使用pywin 32
import win32api
import win32con

def is_caps_lock_on() -> bool:
    return bool(win32api.GetKeyState(win32con.VK_CAPITAL) & 1)
使用ctypes
import ctypes

def is_caps_lock_on() -> bool:
    VK_CAPITAL = 0x14
    return bool(ctypes.windll.user32.GetKeyState(VK_CAPITAL) & 1)

这两种解决方案本质上是相同的,但是ctypes版本利用了标准库。
在我的测试中,当caps-lock为ON时,对GetKeyState(VK_CAPITAL)的调用将返回十进制-1270xFFFF_FFFF_FFFF_FF81),而当caps-lock为OFF时,将返回十进制-1280xFFFF_FFFF_FFFF_FF80
& 1屏蔽这个值有效地去除了我们不关心的所有位,只剩下十进制的10;将其传递给bool会得到一个简单的TrueFalse
请注意,在这里并不一定要使用bool,因为您可以很容易地检查10的真实性,但返回布尔值可能更“Python”。

相关问题