Python 用于停止windows脚本的全局热键

Python 用于停止windows脚本的全局热键,python,Python,我正在编写一个脚本,它可以控制我的鼠标,并在一个简单的无限while循环中运行 def main(): while True: do_mouse_stuff() 由于鼠标控制,点击python窗口并点击ctrl-c是一件痛苦的事情,因此我一直在寻找一种在windows中实现全局热键的方法。我也是一个相对的Python noob,所以我可能错过了一个明显的答案。我发现的东西: pyhk-我已经得到的最接近,但是这个模块由于某种原因(可能是我做错了什么)对我的计算机做了一些

我正在编写一个脚本,它可以控制我的鼠标,并在一个简单的无限while循环中运行

def main():
    while True:
        do_mouse_stuff()
由于鼠标控制,点击python窗口并点击ctrl-c是一件痛苦的事情,因此我一直在寻找一种在windows中实现全局热键的方法。我也是一个相对的Python noob,所以我可能错过了一个明显的答案。我发现的东西:

pyhk-我已经得到的最接近,但是这个模块由于某种原因(可能是我做错了什么)对我的计算机做了一些令人讨厌的事情,它引入了严重的鼠标滞后,完全的输入锁定,所有我不够聪明的事情来处理

pyHook-遵循,工作正常,但无限运行的消息泵和我的while循环似乎只运行,我还没有弄清楚如何使其工作

-我也发现了这个方法,但是我和pyHook有同样的问题,try循环和我的while循环不能共存

我曾试图找出如何将我的循环集成到这些示例中,而不是维护一个单独的循环,但由于我的noobishness,我无法实现这一点。有人能告诉我怎么做吗?

也许可以使用?我不确定它是否是“全局的”,不幸的是,我现在无法测试它,但这里有一个检测Escape键(取自)的示例,它与您的键盘材料集成在一起:

import msvcrt

def main():
    while True:
        do_mouse_stuff()

        # Check if `Esc` has been pressed
        if msvcrt.kbhit() and msvcrt.getch() == chr(27).encode():
            aborted = True
            break

如果您想自己实现一个消息循环,那么它必须是一个且唯一一个发送所有事件的消息循环,无论是来自键盘、鼠标还是其他任何地方。这就是为什么pyHook似乎不适合你。这正是问题所在,我不知道如何使它成为一个循环,因为messagePump和try循环似乎排除了我试图添加到它们的任何内容。一旦我的代码正常工作,全局热键就不起作用,而一旦全局热键正常工作,脚本就会坐在那里等待热键,而不是执行我的功能。为什么不使用已经有工作消息队列的东西,例如qt应用程序。这似乎增加了很多复杂性,特别是对于我这个Python新手(对Qt也是新手)。不过我会调查的。我根本无法让msvcrt正常工作,我四处寻找了更多的例子,看起来你的实现非常成功,但无论出于什么原因,它在我的系统上都无法正常工作。阅读,尝试,但我得到的所有输出都是ÿ,而不是我按下的键。@user1900018:经过更多的实验,似乎
msvcrt
无法处理全局按键。使用示例代码,点击
Esc
成功地从循环中跳出,但前提是运行Python的窗口具有焦点。