Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

静默启动模拟器 #3940

Open
PPPlatelet opened this issue Jun 28, 2024 · 0 comments
Open

静默启动模拟器 #3940

PPPlatelet opened this issue Jun 28, 2024 · 0 comments
Labels
feature request / 功能请求 New feature or requests

Comments

@PPPlatelet
Copy link
Contributor

PPPlatelet commented Jun 28, 2024

解决方案

#3934
增加的功能:
静默启动模拟器可选常规模式、最小化模式、静默模式
当任务队列清空后可关闭模拟器
若距离下个任务的时间小于 X 分钟, 则由关闭模拟器转为用户指定的其他方法,默认为停在原处

其他内容

api_windows.py中增加的方法:

  1. _enum_process()和_enum_thread():遍历进程/线程,调用__yieldloop
  2. getfocusedwindow()和setforegroundwindow():获取当前聚焦的窗口/重新聚焦窗口
  3. execute():创建进程并返回进程和当前聚焦的窗口,进程为元组,包含有内核进程对象,内核线程对象,进程pid,主线程id
  4. terminate_process():无条件结束进程
  5. get_hwnds():遍历窗口获取模拟器的窗口句柄
  6. get_cmdline():使用模拟器pid读取模拟器的cmdline
  7. get_thread_creation_time():根据tid读取线程创建的时间
  8. get_thread():根据pid获取主线程id
  9. get_process():遍历进程并用正则匹配获取模拟器的进程,调用_get_process()
  10. switch_window():根据窗口句柄过滤并切换窗口状态

winapi中增加的方法:

const_windows.py

  • 设置了调用winapi所需的常量

structures_windows.py

  1. 设置了EmulatorLaunchFailedError,HwndNotFoundError,IterationFinished异常
  2. STARTUPINFOW():继承于ctypes.Structure,指定了窗口工作站、桌面、标准句柄和main窗口的外观,用于execute()
  3. PROCESS_INFORMATION():包含有关新创建的进程及其主线程的信息,用于execute()
  4. SECURITY_ATTRIBUTES():包含对象的安全描述符,并指定通过指定此结构检索的句柄是否可继承,用于CreateProcessW()
  5. PROCESSENTRY32()和THREADENTRY32():描述采用快照时驻留在系统地址空间中的进程的列表中的条目/描述获取快照时在系统中执行的线程列表中的条目,用于_enum_processes()/_enum_threads()
  6. WINDOWPLACEMENT():包含有关窗口在屏幕上的位置的信息,用于getfocusedwindow()
  7. LIST_ENTRY():描述双向链表中的条目,或用作此类列表的标题,用于PEB_LDR_DATA()
  8. UNICODE_STRING():用于传递Unicode字符串,用于RTL_USER_PROCESS_PARAMETERS(),CURDIR(),RTL_DRIVE_LETTER_CURDIR()
  9. PEB_LDR_DATA():包含有关为进程加载的模块的信息,用于PEB()
  10. PEB():包含进程信息,用于get_cmdline()和PROCESS_BASIC_INFORMATION()
  11. CURDIR():包含进程当前目录的信息,用于RTL_USER_PROCESS_PARAMETERS()
  12. RTL_DRIVE_LETTER_CURDIR():包含每个驱动器号的当前目录信息,用于RTL_USER_PROCESS_PARAMETERS()
  13. RTL_USER_PROCESS_PARAMETERS():包含进程参数信息,用于get_cmdline()
  14. PROCESS_BASIC_INFORMATION():包含进程基本信息,用于get_cmdline()
  15. FILETIME():包含一个 64 位值,表示自 1601 年 1 月 1 日 (UTC) 以来的 100 纳秒间隔数,用于_get_thread_creation_time()和GetThreadTimes

functions.py

  • 设置了winapi所需的函数
  • 封装了Handle类以安全的销毁handle
  • 定义了report()函数以决定出现异常时的行为

platform_windows.py

  • 定义了EmulatorStatus类以储存模拟器基本信息
  • 重写了execute()函数,根据self.config.Emulator_SilentStart决定创建进程时的行为
  • 重写了getfocusedwindow()和setforegroundwindow()函数,将WINDOWPLACEMENT存储在EmulatorStatus中
  • 增加了CloseHandle()、get_hwnds()、get_process()、get_cmdline()函数以调用winapi
  • 增加了switch_window()函数,根据self.config.Emulator_SilentStart对模拟器窗口进行切换
  • 增加了emulator_check()函数,检查模拟器是否运行
  • 修改了kill_emulator_by_regex()函数,调用winapi的terminate_process()
  • 修改了emulator_start_watch()函数,当窗口不符时尝试重聚焦

device.py

  • 修改了emulator_start()和emulator_stop()函数
  • 增加了emulator_check()和switch_window()以调用winapi

alas.py

  • 在get_next_task()中增加了stop_emulator分支,优化嵌套
  • 增加了emurestart()函数
  • 增加了ProcessBufferTime和BufferMethod,设定了调度器在缓冲时间内的行为
  • 在loop中增加了emulator_check()
@PPPlatelet PPPlatelet added the feature request / 功能请求 New feature or requests label Jun 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature request / 功能请求 New feature or requests
Projects
None yet
Development

No branches or pull requests

1 participant