【Python】如何使用Python和ADB控制安卓设备进行鼠标操作
这段代码实现了一个可以使用鼠标控制安卓设备的小工具。它使用了Pygame库来显示设备屏幕和捕获鼠标事件,以及使用了ADB命令来模拟屏幕滑动和鼠标点击事件
·
项目简介
这段代码实现了一个可以使用鼠标控制安卓设备的小工具。它使用了Pygame库来显示设备屏幕和捕获鼠标事件,以及使用了ADB命令来模拟屏幕滑动和鼠标点击事件。具体来说,代码实现了以下功能:
1、获取设备屏幕大小并设置Pygame窗口大小以匹配设备分辨率。
2、使用ADB命令捕获设备屏幕并将其显示在Pygame窗口中。
3、处理鼠标点击事件并将其转换为ADB命令以在设备上执行相应的操作。
4、处理鼠标移动事件并将其转换为设备屏幕上的滑动事件。
5、将滑动事件转换为ADB命令以在设备上执行相应的操作。
项目代码
import re
import sys
import pygame
import subprocess
from io import BytesIO
"""
这段代码实现了一个可以使用鼠标控制安卓设备的小工具。它使用了Pygame库来显示设备屏幕和捕获鼠标事件,以及使用了ADB命令来模拟屏幕滑动和鼠标点击事件。具体来说,代码实现了以下功能:
获取设备屏幕大小并设置Pygame窗口大小以匹配设备分辨率。
使用ADB命令捕获设备屏幕并将其显示在Pygame窗口中。
处理鼠标点击事件并将其转换为ADB命令以在设备上执行相应的操作。
处理鼠标移动事件并将其转换为设备屏幕上的滑动事件。
将滑动事件转换为ADB命令以在设备上执行相应的操作。
"""
# 设置ADB命令来捕获设备屏幕和发送鼠标事件
adb_tap_cmd = "adb shell input tap {} {}"
# 设置ADB命令来捕获设备屏幕
adb_cmd = "adb shell screencap -p"
# 初始化Pygame
pygame.init()
def get_screen_size():
# 使用ADB命令获取安卓设备屏幕大小
output = subprocess.check_output(['adb', 'shell', 'wm', 'size']).decode()
match = re.search(r'(\d+)x(\d+)', output)
if match:
width, height = int(match.group(1)), int(match.group(2))
return width, height
else:
raise RuntimeError('Failed to get screen size')
# 获取安卓设备屏幕大小
width, height = get_screen_size()
# 设置窗口大小以匹配您的设备分辨率
window_size = (width * 0.3, height * 0.3)
screen = pygame.display.set_mode(window_size)
def save_png_load(screenshot):
# 将截图保存到本地
with open('screenshot.png', 'wb') as f:
f.write(screenshot)
# 加载截图到Pygame中
try:
image = pygame.image.load('screenshot.png')
except pygame.error as e:
print(e)
return ""
# 缩放图像以适应窗口大小
image = pygame.transform.scale(image, window_size)
return image
def swipe(x1, y1, x2, y2, duration=300):
# 使用ADB命令模拟滑动屏幕事件
subprocess.run(
['adb', 'shell', 'input', 'swipe', str(x1), str(y1), str(x2), str(y2), str(duration)])
# 捕获和显示屏幕
while True:
# 捕获设备屏幕
process = subprocess.Popen(adb_cmd.split(), stdout=subprocess.PIPE)
screenshot = process.communicate()[0].replace(b'\r\n', b'\n')
# 将截图数据转换为Pillow Image对象
image = pygame.image.load(BytesIO(screenshot))
# 缩放图像以适应窗口大小
image = pygame.transform.scale(image, window_size)
# 显示图像
screen.blit(image, (0, 0))
pygame.display.update()
# 处理Pygame事件(如关闭窗口或鼠标点击)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
# 将鼠标点击事件转换为安卓设备的tap命令
x, y = event.pos
x *= width / window_size[0]
y *= height / window_size[1]
tap_cmd = adb_tap_cmd.format(int(x), int(y))
# 发送tap命令到设备
subprocess.run(tap_cmd.split())
elif event.type == pygame.MOUSEMOTION:
# 将鼠标移动事件转换为安卓设备的坐标系
x, y = event.pos
x *= width / window_size[0]
y *= height / window_size[1]
# 如果鼠标左键已按下,则将鼠标移动事件转换为滑动事件
if event.buttons[0]:
# 根据鼠标移动距离计算滑动距离和方向
dx = event.rel[0]
dy = event.rel[1]
distance = (dx ** 2 + dy ** 2) ** 0.5
direction = (dx / distance, dy / distance)
# 计算滑动距离和速度
swipe_distance = min(width, height) * distance / 200
swipe_duration = int(swipe_distance)
# 计算滑动的起点和终点
start_x, start_y = x - direction[0] * swipe_distance / 2, y - direction[1] * swipe_distance / 2
end_x, end_y = x + direction[0] * swipe_distance / 2, y + direction[1] * swipe_distance / 2
# 使用ADB命令模拟滑动事件
swipe_cmd = "adb shell input swipe {} {} {} {} {}".format(
int(start_x), int(start_y), int(end_x),
int(end_y), swipe_duration
)
subprocess.run(swipe_cmd.split())
# 检查Pygame事件(如关闭窗口)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
更多推荐
已为社区贡献1条内容
所有评论(0)