我可以使用Python在OSX中捕获键盘和鼠标事件吗?

我可以使用Python在OSX中捕获键盘和鼠标事件吗?,python,macos,keyboard-hook,Python,Macos,Keyboard Hook,我正在尝试用Python为OSX编写一个简单的宏记录器,它可以在脚本在后台运行时捕获鼠标和按键事件,并回放它们。我可以使用后者,前者有类似的简单库吗?我知道你可以使用诅咒捕捉按键输入,但我不确定鼠标输入。不仅如此,如果我没有弄错的话,它还包含在2.7.2的std库中。这里有一个不使用诅咒的解决方案: 这个问题很久以前在这里被问过- 您可能会发现这里的示例代码很有用 在OSX上的Python中似乎没有这样做的方法。今天我遇到了一些解决这个问题的方法,我想我会在这里循环并分享,这样其他人可以节省搜

我正在尝试用Python为OSX编写一个简单的宏记录器,它可以在脚本在后台运行时捕获鼠标和按键事件,并回放它们。我可以使用后者,前者有类似的简单库吗?

我知道你可以使用
诅咒
捕捉按键输入,但我不确定鼠标输入。不仅如此,如果我没有弄错的话,它还包含在2.7.2的std库中。

这里有一个不使用诅咒的解决方案:

这个问题很久以前在这里被问过-


您可能会发现这里的示例代码很有用

在OSX上的Python中似乎没有这样做的方法。

今天我遇到了一些解决这个问题的方法,我想我会在这里循环并分享,这样其他人可以节省搜索时间

用于模拟键盘和鼠标输入的漂亮跨平台解决方案:

我还发现了一个简短但有效的(关于山狮)示例,说明了如何全局记录按键。唯一需要注意的是,您必须使用Python2.6,因为2.7似乎没有可用的objc模块

#!/usr/bin/python2.6

"""PyObjC keylogger for Python
by  ljos https://github.com/ljos
"""

from Cocoa import *
import time
from Foundation import *
from PyObjCTools import AppHelper

class AppDelegate(NSObject):
    def applicationDidFinishLaunching_(self, aNotification):
        NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSKeyDownMask, handler)

def handler(event):
    NSLog(u"%@", event)

def main():
    app = NSApplication.sharedApplication()
    delegate = AppDelegate.alloc().init()
    NSApp().setDelegate_(delegate)
    AppHelper.runEventLoop()

if __name__ == '__main__':
   main()
对于鼠标输入,只需使用以下列表中的相关掩码替换
NSKeyDownMask

例如,
NSMouseMovedMask
用于跟踪鼠标移动。
从那里,您可以访问event.locationInWindow()或其他属性

Calvin Cheng,谢谢你。您的建议适用于OS X 10.8.5

代码来自

还有一个解决方案

这里提到的一些软件包支持OSX(例如
键盘
):
#!/usr/bin/python

import termios, fcntl, sys, os

fd = sys.stdin.fileno()

oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)

try:
    while 1:
        try:
            c = sys.stdin.read(1)
            print "Got character", repr(c)
        except IOError: pass
finally:
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)