【问题标题】:Detecting Key Presses using win32api in Python在 Python 中使用 win32api 检测按键
【发布时间】:2011-04-08 08:30:44
【问题描述】:

我正在尝试使用 win32api 通过特定按键来打破 Python 中的循环。怎么办?

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

修订:

import win32api

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

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

编辑:

我正在尝试制作一个反复报告鼠标位置的程序,我需要一种机制来退出所述程序。

查看修改后的代码。

【问题讨论】:

    标签: python winapi key-bindings


    【解决方案1】:

    win32api 只是底层 windows 低级库的接口。 见GetAsyncKeyState Function

    确定在调用函数时某个键是向上还是向下,以及在上一次调用 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
    

    【讨论】:

      【解决方案2】:

      这不是它在 GUI 编程中的工作方式。您不会调用方法来检查按键。相反,当您按下键时,您会收到发送消息。假设您有一个正在接收输入的窗口,那么您需要响应到达您的窗口过程的WM_KEYDOWN 消息,或 Python win32api 术语中的消息映射。


      您的编辑表明您没有使用相当不寻常的消息队列。致电GetAsyncKeyState(),或许可以实现您的愿望。

      【讨论】:

        【解决方案3】:

        检查 github 上的 python tiler,即使您只是想找到要发送的关键代码,它也非常有用。如果您在后台运行代码并想从窗口外中断循环,这也很有用。

        git 项目: https://github.com/Tzbob/python-windows-tiler

        带有 windows 键的代码: https://code.google.com/p/python-windows-tiler/source/browse/pwt/hotkey.py?r=df41af2a42b6304047a5f6f1f2903b601b22eb39

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-17
          • 2010-09-22
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          相关资源
          最近更新 更多