在Python中使用win32api检测键盘按键

4 投票
3 回答
35819 浏览
提问于 2025-04-16 15:19

我想在Python中通过按下特定的键来中断一个循环,使用的是win32api。请问该怎么做呢?

在下面的代码中,win32api.KeyPress('H')的实际版本是什么?

修改版:

import win32api

while True :
    cp = win32api.GetCursorPos()
    print cp
    if win32api.KeyPress('H') == True :
        break

我希望能够通过按下h键来中断一个循环。

编辑:

我正在尝试制作一个程序,它会不断报告鼠标的位置,我需要一个方法来退出这个程序。

请查看修改后的代码。

3 个回答

2

你可以去GitHub上看看这个Python的平铺工具,挺有用的,特别是如果你只是想找一些按键代码来发送的话。还有,如果你在后台运行代码,想要从窗口外部中断循环,这个工具也会很有帮助。

这个项目的地址是: https://github.com/Tzbob/python-windows-tiler

包含Windows按键的代码在这里: https://code.google.com/p/python-windows-tiler/source/browse/pwt/hotkey.py?r=df41af2a42b6304047a5f6f1f2903b601b22eb39

2

在图形用户界面(GUI)编程中,事情并不是这样运作的。你并不是通过调用一个方法来检查键盘是否被按下。相反,当按键被按下时,系统会发送消息给你。如果你有一个窗口在接收输入,那么你需要在窗口的处理程序中响应 WM_KEYDOWN 消息,或者在 Python 的 win32api 中称为消息映射。


你的编辑显示你没有使用消息队列,这有点不寻常。你可能可以通过调用 GetAsyncKeyState() 来实现你想要的功能。

14

win32api 是一个用来和 Windows 底层库进行交互的接口。

可以看看这个 GetAsyncKeyState 函数

这个函数可以判断在调用时某个键是被按下还是松开,以及这个键在上一次调用 GetAsyncKeyState 之后是否被按过。

语法

SHORT WINAPI GetAsyncKeyState(
__in  int vKey
);

返回值

类型:SHORT

如果函数成功执行,返回值会告诉你自上次调用 GetAsyncKeyState 以来这个键是否被按下,以及当前这个键是被按下还是松开。如果返回值的最高位被设置,说明这个键是被按下的;如果最低位被设置,说明这个键是在上一次调用 GetAsyncKeyState 之后被按下的。

注意,返回值是以位编码的(不是简单的 boolean 值)。

要获取 vKey 的值,程序可以使用 win32con 模块中的虚拟键码常量。

例如,测试 "CAPS LOCK" 键:

>>> import win32api
>>> import win32con
>>> win32con.VK_CAPITAL
20
>>> win32api.GetAsyncKeyState(win32con.VK_CAPITAL)
0
>>> win32api.GetAsyncKeyState(win32con.VK_CAPITAL)
1

简单字母的虚拟键常量是 ASCII 码,所以测试 "H" 键(键被按下)看起来像这样:

>>> win32api.GetAsyncKeyState(ord('H'))
1

撰写回答