-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCapture_Keyboard_and_Send_ADB.py
More file actions
170 lines (154 loc) · 5.92 KB
/
Capture_Keyboard_and_Send_ADB.py
File metadata and controls
170 lines (154 loc) · 5.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# This code is purely generated by AI and is not intended to be used in production.
from pynput import keyboard
import time
import subprocess
import pygetwindow
stop_flag = False
WINDOW_TITLE_KEYWORD = "Capture_Keyboard_and_Send_ADB" # 可根据实际窗口标题调整
def send_adb_text(char):
# 发送单个字符到adb(异步)
subprocess.Popen(
["adb", "shell", "input", "text", char],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
def send_adb_keyevent(keycode):
# 发送按键事件到adb(异步)
subprocess.Popen(
["adb", "shell", "input", "keyevent", str(keycode)],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
def is_our_window_active(): # sourcery skip: use-contextlib-suppress
try:
win = pygetwindow.getActiveWindow()
if win and WINDOW_TITLE_KEYWORD in win.title:
return True
except Exception:
pass
return False
def check_adb_connection():
try:
result = subprocess.run(
["adb", "get-state"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
timeout=3,
encoding="utf-8"
)
if result.returncode == 0 and "device" in result.stdout:
return True
print("未检测到已连接的ADB设备,请检查ADB连接。")
return False
except Exception as e:
print(f"ADB检测异常: {e}")
return False
def on_press(key):
if not is_our_window_active():
return
try:
# 捕获所有可打印字符(包括符号)
if hasattr(key, "char") and key.char is not None:
special_escape = {'&', '?', '#', '*', '(', ')', '|', ';', '<', '>', '$', '\\', '"', "'"}
if key.char == "'":
print("捕获到: 单引号")
send_adb_text('\\' + "'") # 转义单引号
elif key.char == '"':
print("捕获到: 双引号")
send_adb_text('\\"') # 转义双引号
elif key.char == ";":
print("捕获到: 分号")
send_adb_text('\\;') # 转义分号
elif key.char == ":":
print("捕获到: 冒号")
send_adb_text('\\:') # 转义冒号
elif key.char == ",":
print("捕获到: 逗号")
send_adb_text('\\,') # 转义逗号
elif key.char == ".":
print("捕获到: 句号")
send_adb_text('\\.') # 转义句号
elif key.char == "<":
print("捕获到: 小于号")
send_adb_text('\\<') # 转义小于号
elif key.char == ">":
print("捕获到: 大于号")
send_adb_text('\\>') # 转义大于号
elif key.char == " ":
print("捕获到: 空格")
send_adb_keyevent(62) # Android SPACE
elif key.char in special_escape:
print(f"捕获到: 特殊符号 {key.char}")
send_adb_text('\\' + key.char)
else:
print(f"捕获到: {key.char}")
send_adb_text(key.char)
elif hasattr(key, "vk"):
# 小键盘数字区间通常为 96~105
if 96 <= key.vk <= 105:
num = str(key.vk - 96)
print(f"捕获到: 小键盘数字 {num}")
send_adb_text(num)
elif key.vk == 110: # Numpad .
print("捕获到: 小键盘小数点")
send_adb_text('.')
elif key.vk == 107: # Numpad +
print("捕获到: 小键盘加号")
send_adb_text('+')
elif key.vk == 109: # Numpad -
print("捕获到: 小键盘减号")
send_adb_text('-')
elif key.vk == 106: # Numpad *
print("捕获到: 小键盘乘号")
send_adb_text('*')
elif key.vk == 111: # Numpad /
print("捕获到: 小键盘除号")
send_adb_text('/')
# 捕获其他特殊按键
elif key == keyboard.Key.space:
print("捕获到: Space")
send_adb_keyevent(62) # Android SPACE
elif key == keyboard.Key.backspace:
print("捕获到: Backspace")
send_adb_keyevent(67) # Android DEL
elif key == keyboard.Key.enter:
print("捕获到: Enter")
send_adb_keyevent(66) # Android ENTER
elif key == keyboard.Key.home:
print("捕获到: Home")
send_adb_keyevent(3) # Android HOME
elif key == keyboard.Key.end:
print("捕获到: End")
send_adb_keyevent(123) # Android MOVE_END
elif key == keyboard.Key.left:
print("捕获到: Left")
send_adb_keyevent(21) # Android DPAD_LEFT
elif key == keyboard.Key.right:
print("捕获到: Right")
send_adb_keyevent(22) # Android DPAD_RIGHT
elif key == keyboard.Key.up:
print("捕获到: Up")
send_adb_keyevent(19) # Android DPAD_UP
elif key == keyboard.Key.down:
print("捕获到: Down")
send_adb_keyevent(20) # Android DPAD_DOWN
elif key == keyboard.Key.tab:
print("捕获到: Tab")
send_adb_keyevent(61) # Android TAB
elif key == keyboard.Key.esc:
print("捕获到: Esc")
send_adb_keyevent(111) # Android ESCAPE
# 可根据需要继续添加其他特殊键
except AttributeError:
print(f"捕获到特殊键: {key}")
if __name__ == "__main__":
if not check_adb_connection():
exit(1)
listener = keyboard.Listener(on_press=on_press)
listener.start()
try:
while listener.is_alive():
time.sleep(0.01)
except KeyboardInterrupt:
print("监听已中断。")
listener.stop()