使用Win32api检查是否在后台按下了键

时间:2019-04-08 08:09:24

标签: python winapi keypress

我正在尝试制作一个简单的Python脚本以在工作站解锁时从我的网络摄像头捕获图像。 我正在做一个“杀死开关”,检查是否按下了按键,如果按下,程序将无法运行。 我的问题是我需要检查是否按下了键,但找不到解决方法。 我已经尝试过了:

 keyState = win32api.GetAsyncKeyState(17)

但这不起作用。

从文档中:

  

如果另一个线程或进程中的窗口,则返回值为零   当前具有键盘焦点。

所以它并没有真正帮助我。 我在Windows顺便说一句。

1 个答案:

答案 0 :(得分:0)

首先,GetAsyncKeyState()还需要AND(&)0x8000以确保密钥已按下。

  

返回值

     

类型:简短

     

如果函数成功,则返回值指定键是否   自上次调用GetAsyncKeyState以来,按下了该键,以及是否   按键当前是向上还是向下。如果设置了最高有效位,则   键已按下,如果设置了最低有效位,则该键为   在上一次调用GetAsyncKeyState之后按下。

请注意,返回值是位编码的(不是布尔值)。您应该清除最低有效位,例如:

keyState = win32api.GetAsyncKeyState(17)&0x8000.

并且,有一个简单的解决方案没有python中的窗口焦点。您可以通过pynput来获取它。

命令行:

> pip install pynput

Python代码:

from pynput import keyboard

def on_press(key):
    try: k = key.char # single-char keys
    except: k = key.name # other keys
    if key == *(which you want to set):#To Do.

lis = keyboard.Listener(on_press=on_press)
lis.start() # start to listen on a separate thread
lis.join() # no this if main thread is polling self.keys