2012-03-26 99 views
9

我想在Python中为OSX写一个简单的宏记录器 - 当脚本在后台运行并重播它们时,它可以捕获鼠标和键盘事件。后者可以使用autopy,前者有没有类似的简单库?我可以使用Python捕获OSX中的键盘和鼠标事件吗?

+0

这里所提到的一些包有OS X的支持(例如'keyboard'):https://stackoverflow.com/questions/11918999/key -listeners合蟒/ – 2017-10-28 20:05:36

回答

0

在OSX上似乎没有办法在Python上这样做。

1

我知道你可以使用curses来捕获按键输入,但我不确定鼠标输入。不仅如此,但如果我没有把它误认为包含在2.7.2的std库中。

5

今天我遇到了这个问题的几个解决方案,并认为我会回过头来分享一下,这样其他人可以节省搜索时间。

模拟键盘和鼠标输入一个漂亮的跨平台解决方案:http://www.autopy.org/

我也发现了如何在全球范围内记录击键简短而工作(由于山狮)的例子。唯一的警告是你必须使用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() 

对于鼠标输入,简单地从可用这里的列表中选择相关面膜代替NSKeyDownMaskhttp://developer.apple.com/library/mac/#documentation/cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html#//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler

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

-2

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

代码从http://docs.python.org/faq/library.html#how-do-i-get-a-single-keypress-at-a-time

#!/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) 

还有一个解决方案 Key Listeners in python?

相关问题