如何在 Python 中获取鼠标 up/down/moved 和按键事件
How to get mouse up/down/moved and key press events in Python
我已经在为 Linux 编写的 Python 2.7 项目上工作了一段时间,以向其添加 Windows 支持。我想弄清楚如何获取键盘按下和鼠标移动、按下或释放的事件。我安装了 win32api 和 pyHook,但我不知道如何正确安装。请注意,我希望它无论在何处都能获得事件,而不仅仅是在命令提示符下按下时。以下是 linux:
中的操作方法
def handle_event(self):
""" This function is called when a xlib event is fired """
data = reply.data
while len(data):
event, data = rq.EventField(None).parse_binary_value(data, self._display.display, None, None)
if event.type == X.MotionNotify:
if self._mouse_last_x != None:
mouse_distance=math.sqrt((event.root_x-self._mouse_last_x)**2+(event.root_y-self._mouse_last_y)**2)
self.send_event(('mouse_moved',mouse_distance))
self._mouse_last_x,self._mouse_last_y = event.root_x,event.root_y
if event.type == X.ButtonPress:
print event.sequence_number,event._data,event._fields
self.send_event(('button_down',event._data['detail']))
elif event.type == X.ButtonRelease:
print event.sequence_number,event._data,event._fields
self.send_event(('button_up',event._data['detail']))
elif event.type == X.KeyPress and event.sequence_number == 0:
key = event.detail
self.send_event(('keys_pressed',key,1))
def run(self):
self.disable_keyboard_interrupt()
root = self._display.screen().root
ctx = self._display.record_create_context(
0,
[record.AllClients],
[{
'core_requests': (0, 0),
'core_replies': (0, 0),
'ext_requests': (0, 0, 0, 0),
'ext_replies': (0, 0, 0, 0),
'delivered_events': (0, 0),
'device_events': (X.KeyReleaseMask, X.PointerMotionMask),
'errors': (0, 0),
'client_started': False,
'client_died': False,
}])
self._display.record_enable_context(ctx, self.handle_event)
我似乎无法弄清楚如何使用任何库为 Windows 获取它。
有 Win32 API 函数 SetWindowsHookEx.
Python 上的示例:Applying low-level keyboard hooks with Python and SetWindowsHookExA
pyHook 也是适用于 32 位 Python 的良好软件包(它有点过时,您需要一些努力才能使用 MinGW 为 x64 重新构建它)。示例:Detecting Mouse clicks in windows using python
为了检测鼠标左键和右键的按下或释放,请在此处检查我仅使用 win32api 的解决方案:
Python mouse click detection just with win32api
我已经在为 Linux 编写的 Python 2.7 项目上工作了一段时间,以向其添加 Windows 支持。我想弄清楚如何获取键盘按下和鼠标移动、按下或释放的事件。我安装了 win32api 和 pyHook,但我不知道如何正确安装。请注意,我希望它无论在何处都能获得事件,而不仅仅是在命令提示符下按下时。以下是 linux:
中的操作方法def handle_event(self):
""" This function is called when a xlib event is fired """
data = reply.data
while len(data):
event, data = rq.EventField(None).parse_binary_value(data, self._display.display, None, None)
if event.type == X.MotionNotify:
if self._mouse_last_x != None:
mouse_distance=math.sqrt((event.root_x-self._mouse_last_x)**2+(event.root_y-self._mouse_last_y)**2)
self.send_event(('mouse_moved',mouse_distance))
self._mouse_last_x,self._mouse_last_y = event.root_x,event.root_y
if event.type == X.ButtonPress:
print event.sequence_number,event._data,event._fields
self.send_event(('button_down',event._data['detail']))
elif event.type == X.ButtonRelease:
print event.sequence_number,event._data,event._fields
self.send_event(('button_up',event._data['detail']))
elif event.type == X.KeyPress and event.sequence_number == 0:
key = event.detail
self.send_event(('keys_pressed',key,1))
def run(self):
self.disable_keyboard_interrupt()
root = self._display.screen().root
ctx = self._display.record_create_context(
0,
[record.AllClients],
[{
'core_requests': (0, 0),
'core_replies': (0, 0),
'ext_requests': (0, 0, 0, 0),
'ext_replies': (0, 0, 0, 0),
'delivered_events': (0, 0),
'device_events': (X.KeyReleaseMask, X.PointerMotionMask),
'errors': (0, 0),
'client_started': False,
'client_died': False,
}])
self._display.record_enable_context(ctx, self.handle_event)
我似乎无法弄清楚如何使用任何库为 Windows 获取它。
有 Win32 API 函数 SetWindowsHookEx.
Python 上的示例:Applying low-level keyboard hooks with Python and SetWindowsHookExA
pyHook 也是适用于 32 位 Python 的良好软件包(它有点过时,您需要一些努力才能使用 MinGW 为 x64 重新构建它)。示例:Detecting Mouse clicks in windows using python
为了检测鼠标左键和右键的按下或释放,请在此处检查我仅使用 win32api 的解决方案: Python mouse click detection just with win32api