276 lines
7.2 KiB
Python
276 lines
7.2 KiB
Python
"""
|
||
InputSimulator 使用示例
|
||
演示如何使用输入模拟器进行鼠标点击、滑动和键盘操作
|
||
|
||
运行前请确保:
|
||
1. 游戏《桃源深处有人家》已启动
|
||
2. 游戏窗口可见(未被最小化)
|
||
3. 以管理员权限运行此脚本
|
||
"""
|
||
|
||
import sys
|
||
import time
|
||
from pathlib import Path
|
||
|
||
# 添加项目根目录到路径
|
||
sys.path.insert(0, str(Path(__file__).parent))
|
||
|
||
from src.core.game_window import GameWindowManager
|
||
from src.core.input_simulator import InputSimulator
|
||
|
||
|
||
def demo_basic_click():
|
||
"""演示基础点击"""
|
||
print("\n" + "="*50)
|
||
print("演示1: 基础点击")
|
||
print("="*50)
|
||
|
||
# 捕获游戏窗口
|
||
window = GameWindowManager()
|
||
if not window.capture_window():
|
||
print("❌ 未找到游戏窗口,请确保游戏已运行")
|
||
return False
|
||
|
||
print(f"✅ 已捕获窗口: {window.client_size}")
|
||
|
||
# 创建模拟器
|
||
sim = InputSimulator(window)
|
||
|
||
# 获取窗口中心坐标
|
||
size = window.client_size
|
||
center_x = size[0] // 2
|
||
center_y = size[1] // 2
|
||
|
||
print(f"\n将在窗口中心 ({center_x}, {center_y}) 进行点击演示")
|
||
print("3秒后开始...")
|
||
time.sleep(3)
|
||
|
||
# 1. 短按点击
|
||
print("\n1. 短按点击...")
|
||
sim.click(center_x, center_y)
|
||
time.sleep(1)
|
||
|
||
# 2. 长按1秒
|
||
print("2. 长按1秒...")
|
||
sim.click(center_x, center_y, duration=1.0)
|
||
time.sleep(1)
|
||
|
||
# 3. 双击
|
||
print("3. 双击...")
|
||
sim.double_click(center_x, center_y)
|
||
time.sleep(1)
|
||
|
||
print("✅ 点击演示完成")
|
||
return True
|
||
|
||
|
||
def demo_swipe():
|
||
"""演示滑动操作"""
|
||
print("\n" + "="*50)
|
||
print("演示2: 滑动操作")
|
||
print("="*50)
|
||
|
||
window = GameWindowManager()
|
||
if not window.capture_window():
|
||
print("❌ 未找到游戏窗口")
|
||
return False
|
||
|
||
sim = InputSimulator(window)
|
||
size = window.client_size
|
||
|
||
# 计算滑动起点和终点
|
||
start_x = size[0] // 4
|
||
start_y = size[1] // 2
|
||
end_x = size[0] * 3 // 4
|
||
end_y = size[1] // 2
|
||
|
||
print(f"\n将从 ({start_x}, {start_y}) 滑动到 ({end_x}, {end_y})")
|
||
print("3秒后开始...")
|
||
time.sleep(3)
|
||
|
||
# 水平滑动
|
||
print("\n1. 水平滑动(0.5秒)...")
|
||
sim.swipe(start_x, start_y, end_x, end_y, duration=0.5)
|
||
time.sleep(1)
|
||
|
||
# 垂直滑动
|
||
print("2. 垂直滑动(0.5秒)...")
|
||
sim.swipe(size[0] // 2, size[1] // 4, size[0] // 2, size[1] * 3 // 4, duration=0.5)
|
||
time.sleep(1)
|
||
|
||
# 对角线滑动
|
||
print("3. 对角线滑动(1秒)...")
|
||
sim.swipe(100, 100, size[0]-100, size[1]-100, duration=1.0)
|
||
time.sleep(1)
|
||
|
||
print("✅ 滑动演示完成")
|
||
return True
|
||
|
||
|
||
def demo_keyboard():
|
||
"""演示键盘操作"""
|
||
print("\n" + "="*50)
|
||
print("演示3: 键盘操作")
|
||
print("="*50)
|
||
|
||
window = GameWindowManager()
|
||
if not window.capture_window():
|
||
print("❌ 未找到游戏窗口")
|
||
return False
|
||
|
||
sim = InputSimulator(window)
|
||
|
||
print("\n3秒后开始键盘演示...")
|
||
print("注意:请确保游戏窗口可以接收键盘输入")
|
||
time.sleep(3)
|
||
|
||
# 1. 按ESC键(通常用于关闭菜单)
|
||
print("\n1. 按 ESC 键...")
|
||
sim.key_press('esc')
|
||
time.sleep(1)
|
||
|
||
# 2. 按空格键
|
||
print("2. 按空格键...")
|
||
sim.key_press('space')
|
||
time.sleep(1)
|
||
|
||
# 3. 组合按键示例:按住Ctrl再按A
|
||
print("3. 组合按键 Ctrl+A...")
|
||
sim.key_down('ctrl')
|
||
sim.key_press('a')
|
||
sim.key_up('ctrl')
|
||
time.sleep(1)
|
||
|
||
print("✅ 键盘演示完成")
|
||
return True
|
||
|
||
|
||
def demo_game_automation():
|
||
"""
|
||
演示游戏自动化场景
|
||
模拟一个简单的游戏操作流程
|
||
"""
|
||
print("\n" + "="*50)
|
||
print("演示4: 游戏自动化场景")
|
||
print("="*50)
|
||
|
||
window = GameWindowManager()
|
||
if not window.capture_window():
|
||
print("❌ 未找到游戏窗口")
|
||
return False
|
||
|
||
sim = InputSimulator(window)
|
||
size = window.client_size
|
||
|
||
print("\n这是一个模拟的游戏自动化流程:")
|
||
print("1. 打开菜单(点击菜单按钮)")
|
||
print("2. 选择选项(滑动选择)")
|
||
print("3. 确认(点击确认按钮)")
|
||
print("4. 关闭菜单(按ESC)")
|
||
|
||
print("\n5秒后开始自动化流程...")
|
||
time.sleep(5)
|
||
|
||
# 步骤1: 点击菜单按钮(假设在右上角)
|
||
print("\n步骤1: 点击菜单按钮...")
|
||
menu_x = size[0] - 100
|
||
menu_y = 100
|
||
sim.click(menu_x, menu_y)
|
||
time.sleep(1)
|
||
|
||
# 步骤2: 滑动选择选项
|
||
print("步骤2: 滑动选择选项...")
|
||
sim.swipe(size[0]//2, size[1]//2, size[0]//2, size[1]//2 - 200, duration=0.3)
|
||
time.sleep(1)
|
||
|
||
# 步骤3: 点击确认按钮
|
||
print("步骤3: 点击确认按钮...")
|
||
confirm_x = size[0] // 2
|
||
confirm_y = size[1] - 150
|
||
sim.click(confirm_x, confirm_y)
|
||
time.sleep(1)
|
||
|
||
# 步骤4: 关闭菜单
|
||
print("步骤4: 关闭菜单...")
|
||
sim.key_press('esc')
|
||
time.sleep(1)
|
||
|
||
print("✅ 自动化流程完成")
|
||
return True
|
||
|
||
|
||
def check_admin():
|
||
"""检查是否以管理员权限运行"""
|
||
import ctypes
|
||
try:
|
||
return ctypes.windll.shell32.IsUserAnAdmin()
|
||
except:
|
||
return False
|
||
|
||
|
||
def main():
|
||
"""主函数"""
|
||
print("="*50)
|
||
print("InputSimulator 使用示例")
|
||
print("="*50)
|
||
print("\n请确保游戏《桃源深处有人家》已启动")
|
||
print("游戏窗口需要可见(未被最小化)")
|
||
|
||
# 检查管理员权限
|
||
if not check_admin():
|
||
print("\n⚠️ 警告:未以管理员权限运行")
|
||
print("某些功能可能无法正常工作")
|
||
print("建议:右键点击命令提示符/终端,选择'以管理员身份运行'")
|
||
print()
|
||
response = input("是否继续运行?(y/n): ").strip().lower()
|
||
if response != 'y':
|
||
print("程序已退出")
|
||
return
|
||
|
||
# 显示菜单
|
||
while True:
|
||
print("\n" + "="*50)
|
||
print("请选择要运行的演示:")
|
||
print("="*50)
|
||
print("1. 基础点击演示")
|
||
print("2. 滑动操作演示")
|
||
print("3. 键盘操作演示")
|
||
print("4. 游戏自动化场景演示")
|
||
print("5. 运行全部演示")
|
||
print("0. 退出")
|
||
|
||
choice = input("\n请输入选项 (0-5): ").strip()
|
||
|
||
if choice == '0':
|
||
print("\n感谢使用,再见!")
|
||
break
|
||
elif choice == '1':
|
||
demo_basic_click()
|
||
elif choice == '2':
|
||
demo_swipe()
|
||
elif choice == '3':
|
||
demo_keyboard()
|
||
elif choice == '4':
|
||
demo_game_automation()
|
||
elif choice == '5':
|
||
demo_basic_click()
|
||
demo_swipe()
|
||
demo_keyboard()
|
||
demo_game_automation()
|
||
print("\n" + "="*50)
|
||
print("✅ 所有演示已完成")
|
||
print("="*50)
|
||
else:
|
||
print("\n❌ 无效选项,请重新输入")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
try:
|
||
main()
|
||
except KeyboardInterrupt:
|
||
print("\n\n程序被用户中断")
|
||
except Exception as e:
|
||
print(f"\n❌ 发生错误: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|