autoxkit 2.2.0__tar.gz → 2.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. {autoxkit-2.2.0 → autoxkit-2.3.0}/PKG-INFO +8 -1
  2. {autoxkit-2.2.0 → autoxkit-2.3.0}/README.md +7 -0
  3. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/hook/event.py +4 -4
  4. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/hook/hook_listener.py +35 -10
  5. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit.egg-info/PKG-INFO +8 -1
  6. {autoxkit-2.2.0 → autoxkit-2.3.0}/pyproject.toml +1 -1
  7. {autoxkit-2.2.0 → autoxkit-2.3.0}/LICENSE.txt +0 -0
  8. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/__init__.py +0 -0
  9. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/android/__init__.py +0 -0
  10. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/android/adb.py +0 -0
  11. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/android/binary.py +0 -0
  12. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/android/client.py +0 -0
  13. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/android/control.py +0 -0
  14. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/android/control_backup.py +0 -0
  15. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/android/models.py +0 -0
  16. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/android/streams.py +0 -0
  17. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/constants.py +0 -0
  18. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/hook/__init__.py +0 -0
  19. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/hook/hotkey_listener.py +0 -0
  20. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/match/__init__.py +0 -0
  21. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/match/match.py +0 -0
  22. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/mousekey/__init__.py +0 -0
  23. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/mousekey/input.py +0 -0
  24. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/mousekey/keyboard.py +0 -0
  25. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/mousekey/mouse.py +0 -0
  26. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/utils.py +0 -0
  27. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/window/__init__.py +0 -0
  28. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/window/window.py +0 -0
  29. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/window/window_action.py +0 -0
  30. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit/window/window_match.py +0 -0
  31. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit.egg-info/SOURCES.txt +0 -0
  32. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit.egg-info/dependency_links.txt +0 -0
  33. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit.egg-info/requires.txt +0 -0
  34. {autoxkit-2.2.0 → autoxkit-2.3.0}/autoxkit.egg-info/top_level.txt +0 -0
  35. {autoxkit-2.2.0 → autoxkit-2.3.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autoxkit
3
- Version: 2.2.0
3
+ Version: 2.3.0
4
4
  Summary: Python library for Windows automation and Android device screen casting and control
5
5
  Author-email: YorickFin <1582456060@qq.com>
6
6
  License: GPL-3.0-or-later
@@ -91,11 +91,17 @@ def mouse_up(event: MouseEvent):
91
91
  return False
92
92
 
93
93
 
94
+ def mouse_move(event: MouseEvent):
95
+ print(event.action, event.button, event.position)
96
+ return False
97
+
98
+
94
99
  hook_listener = HookListener()
95
100
  hook_listener.add_handler('keydown', key_down)
96
101
  hook_listener.add_handler('keyup', key_up)
97
102
  hook_listener.add_handler('mousedown', mouse_down)
98
103
  hook_listener.add_handler('mouseup', mouse_up)
104
+ hook_listener.add_handler('mousemove', mouse_move)
99
105
  hook_listener.start()
100
106
 
101
107
  print("当前鼠标位置:", hook_listener.get_mouse_position())
@@ -105,6 +111,7 @@ if __name__ == '__main__':
105
111
  hook_listener.wait()
106
112
  except Exception:
107
113
  hook_listener.stop()
114
+
108
115
  ```
109
116
 
110
117
  更多示例代码请参考 [examples](examples)
@@ -68,11 +68,17 @@ def mouse_up(event: MouseEvent):
68
68
  return False
69
69
 
70
70
 
71
+ def mouse_move(event: MouseEvent):
72
+ print(event.action, event.button, event.position)
73
+ return False
74
+
75
+
71
76
  hook_listener = HookListener()
72
77
  hook_listener.add_handler('keydown', key_down)
73
78
  hook_listener.add_handler('keyup', key_up)
74
79
  hook_listener.add_handler('mousedown', mouse_down)
75
80
  hook_listener.add_handler('mouseup', mouse_up)
81
+ hook_listener.add_handler('mousemove', mouse_move)
76
82
  hook_listener.start()
77
83
 
78
84
  print("当前鼠标位置:", hook_listener.get_mouse_position())
@@ -82,6 +88,7 @@ if __name__ == '__main__':
82
88
  hook_listener.wait()
83
89
  except Exception:
84
90
  hook_listener.stop()
91
+
85
92
  ```
86
93
 
87
94
  更多示例代码请参考 [examples](examples)
@@ -21,13 +21,13 @@ class MouseEvent:
21
21
  """
22
22
  鼠标事件
23
23
  Args:
24
- action (str): 事件类型,"MouseDown""MouseUp"
25
- button (str): 鼠标按钮,"MLeft"、"MRight"、"MMiddle"、"side1"、"side2"
24
+ action (str): 事件类型,"MouseDown""MouseUp"或"MouseMove"
25
+ button (str): 鼠标按钮,"MLeft"、"MRight"、"MMiddle"、"MSide1"、"MSide2",MouseMove时为None
26
26
  x (int): 鼠标x坐标
27
27
  y (int): 鼠标y坐标
28
28
  Attributes:
29
- action (str): 事件类型,"MouseDown""MouseUp"
30
- button (str): 鼠标按钮,"MLeft"、"MRight"、"MMiddle"、"side1"、"side2"
29
+ action (str): 事件类型,"MouseDown""MouseUp"或"MouseMove"
30
+ button (str): 鼠标按钮,"MLeft"、"MRight"、"MMiddle"、"MSide1"、"MSide2",MouseMove时为None
31
31
  position (tuple): 鼠标位置,(x, y)格式
32
32
  """
33
33
  def __init__(self, action, button, x, y):
@@ -1,13 +1,16 @@
1
-
2
1
  # hook_listener.py
3
2
  import ctypes
4
3
  from ctypes import wintypes, Structure, POINTER, CFUNCTYPE, byref
5
4
  import threading
5
+ import time
6
6
  from .event import KeyEvent, MouseEvent
7
7
  from ..constants import Hex_Hook_Code
8
8
 
9
9
  HHC = Hex_Hook_Code
10
10
 
11
+ # 消息泵空闲轮询间隔(秒),无消息时休眠此时间以释放 CPU
12
+ MSG_POLL_INTERVAL = 0.001
13
+
11
14
  # ---------- 结构体定义 ----------
12
15
  class KBDLLHOOKSTRUCT(Structure):
13
16
  _fields_ = [
@@ -30,7 +33,7 @@ class MSLLHOOKSTRUCT(Structure):
30
33
  # ---------- 回调类型 ----------
31
34
  HOOKPROC = CFUNCTYPE(ctypes.c_long, ctypes.c_int, wintypes.WPARAM, wintypes.LPARAM)
32
35
 
33
- # ---------- 加载 DLL 并声明 API 签名(你指出必须有的部分) ----------
36
+ # ---------- 加载 DLL 并声明 API 签名 ----------
34
37
  user32 = ctypes.WinDLL('user32', use_last_error=True)
35
38
  kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
36
39
 
@@ -73,6 +76,7 @@ class HookListener:
73
76
  self._on_keyup = []
74
77
  self._on_mousedown = []
75
78
  self._on_mouseup = []
79
+ self._on_mousemove = []
76
80
 
77
81
  # 钩子与线程状态
78
82
  self._thread = None
@@ -107,6 +111,8 @@ class HookListener:
107
111
  self._on_mousedown.append(func)
108
112
  elif event_type == "mouseup":
109
113
  self._on_mouseup.append(func)
114
+ elif event_type == "mousemove":
115
+ self._on_mousemove.append(func)
110
116
  else:
111
117
  raise ValueError("unknown event_type: " + str(event_type))
112
118
 
@@ -130,6 +136,8 @@ class HookListener:
130
136
  target = self._on_mousedown
131
137
  elif event_type == "mouseup":
132
138
  target = self._on_mouseup
139
+ elif event_type == "mousemove":
140
+ target = self._on_mousemove
133
141
  else:
134
142
  raise ValueError("unknown event_type: " + str(event_type))
135
143
  try:
@@ -163,7 +171,9 @@ class HookListener:
163
171
  if result is True:
164
172
  return 1 # 截断事件传播
165
173
  except ValueError as e:
166
- raise e
174
+ print(f"[hook_listener] ValueError in keydown callback: {e}", file=__import__('sys').stderr)
175
+ except Exception as e:
176
+ print(f"[hook_listener] Exception in keydown callback: {e}", file=__import__('sys').stderr)
167
177
  elif wParam in (HHC["KeyUp"], HHC["SysKeyUp"]):
168
178
  event = KeyEvent('KeyUp', kbd.vkCode)
169
179
  for cb in self._on_keyup:
@@ -172,9 +182,11 @@ class HookListener:
172
182
  if result is True:
173
183
  return 1 # 截断事件传播
174
184
  except ValueError as e:
175
- raise e
185
+ print(f"[hook_listener] ValueError in keyup callback: {e}", file=__import__('sys').stderr)
186
+ except Exception as e:
187
+ print(f"[hook_listener] Exception in keyup callback: {e}", file=__import__('sys').stderr)
176
188
  except Exception as e:
177
- raise e
189
+ print(f"[hook_listener] Exception in _keyboard_proc: {e}", file=__import__('sys').stderr)
178
190
 
179
191
  return user32.CallNextHookEx(self.keyboard_hook, nCode, wParam, lParam)
180
192
 
@@ -185,7 +197,17 @@ class HookListener:
185
197
  ms = ctypes.cast(lParam, POINTER(MSLLHOOKSTRUCT)).contents
186
198
  x, y = ms.pt.x, ms.pt.y
187
199
 
188
- if wParam in (HHC["MLeftDown"], HHC["MRightDown"], HHC["MiddleDown"], HHC["XDown"]):
200
+ if wParam == 0x0200: # WM_MOUSEMOVE
201
+ event = MouseEvent("MouseMove", None, x, y)
202
+ for cb in self._on_mousemove:
203
+ try:
204
+ result = cb(event)
205
+ if result is True:
206
+ return 1 # 截断事件传播
207
+ except Exception as e:
208
+ print(f"[hook_listener] Exception in mousemove callback: {e}", file=__import__('sys').stderr)
209
+
210
+ elif wParam in (HHC["MLeftDown"], HHC["MRightDown"], HHC["MiddleDown"], HHC["XDown"]):
189
211
  button = self._get_mouse_button(wParam, ms.mouseData)
190
212
  event = MouseEvent("MouseDown", button, x, y)
191
213
  for cb in self._on_mousedown:
@@ -194,7 +216,7 @@ class HookListener:
194
216
  if result is True:
195
217
  return 1 # 截断事件传播
196
218
  except Exception as e:
197
- raise e
219
+ print(f"[hook_listener] Exception in mousedown callback: {e}", file=__import__('sys').stderr)
198
220
 
199
221
  elif wParam in (HHC["MLeftUp"], HHC["MRightUp"], HHC["MiddleUp"], HHC["XUp"]):
200
222
  button = self._get_mouse_button(wParam, ms.mouseData)
@@ -205,9 +227,9 @@ class HookListener:
205
227
  if result is True:
206
228
  return 1 # 截断事件传播
207
229
  except Exception as e:
208
- raise e
230
+ print(f"[hook_listener] Exception in mouseup callback: {e}", file=__import__('sys').stderr)
209
231
  except Exception as e:
210
- raise e
232
+ print(f"[hook_listener] Exception in _mouse_proc: {e}", file=__import__('sys').stderr)
211
233
 
212
234
  return user32.CallNextHookEx(self.mouse_hook, nCode, wParam, lParam)
213
235
 
@@ -276,9 +298,12 @@ class HookListener:
276
298
  if user32.PeekMessageW(byref(msg), 0, 0, 0, 1): # PM_REMOVE = 1
277
299
  user32.TranslateMessage(byref(msg))
278
300
  user32.DispatchMessageW(byref(msg))
301
+ else:
302
+ # 无消息时休眠,避免 CPU 忙等
303
+ time.sleep(MSG_POLL_INTERVAL)
279
304
  except Exception:
280
305
  # 记录异常但不退出循环,确保钩子持续工作
281
- # 回调中的异常应由上层自行处理
306
+ print("[hook_listener] Exception in message pump", file=__import__('sys').stderr)
282
307
  continue
283
308
 
284
309
  # 离开循环之前确保取消钩子
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autoxkit
3
- Version: 2.2.0
3
+ Version: 2.3.0
4
4
  Summary: Python library for Windows automation and Android device screen casting and control
5
5
  Author-email: YorickFin <1582456060@qq.com>
6
6
  License: GPL-3.0-or-later
@@ -91,11 +91,17 @@ def mouse_up(event: MouseEvent):
91
91
  return False
92
92
 
93
93
 
94
+ def mouse_move(event: MouseEvent):
95
+ print(event.action, event.button, event.position)
96
+ return False
97
+
98
+
94
99
  hook_listener = HookListener()
95
100
  hook_listener.add_handler('keydown', key_down)
96
101
  hook_listener.add_handler('keyup', key_up)
97
102
  hook_listener.add_handler('mousedown', mouse_down)
98
103
  hook_listener.add_handler('mouseup', mouse_up)
104
+ hook_listener.add_handler('mousemove', mouse_move)
99
105
  hook_listener.start()
100
106
 
101
107
  print("当前鼠标位置:", hook_listener.get_mouse_position())
@@ -105,6 +111,7 @@ if __name__ == '__main__':
105
111
  hook_listener.wait()
106
112
  except Exception:
107
113
  hook_listener.stop()
114
+
108
115
  ```
109
116
 
110
117
  更多示例代码请参考 [examples](examples)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "autoxkit"
7
- version = "2.2.0"
7
+ version = "2.3.0"
8
8
  description = "Python library for Windows automation and Android device screen casting and control"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
File without changes
File without changes
File without changes
File without changes
File without changes