实现windows下简单的自动化窗口管理

转载或者引用本文内容请注明来源及原作者

一、问题描述

  • 用户的应用场景非常简单:一个无主播的线上弹幕游戏,需要定时开启和关闭直播,直播平台是在Windows端的某播伴侣。

二、分析需求

  • 首先需要定时任务管理。在特定的时间进行应用的管理,并且能够支持用户进行修改
  • 其次需要在对应应用上点击验证。某播平台需要一系列的点击验证,需要在开启后进行这一连串的操作,实现上线直播
  • 最后为了方便实现逻辑

三、步步为营

  • 通过需求的分析,并且我们想要快速的在Windows上实现该需求,简单查找资料,发现Python语言能够很方便的实现。
    这里我们选择的环境为Python3.11,搭建好环境后开始我们的编码吧!

定时任务(schedule

  • schedule 是我们常见的Python中处理定时任务的老伙计了。通过import导入我们的schedule,简单的几行代码即可实现:

    py 复制代码
      #每天定时开启和关闭(open_time和close_time是时间)
      #open_window和close_window是我们第二步要做的事情
      schedule.every().day.at(open_time).do(open_window) 
      schedule.every().day.at(close_time).do(close_window) 

软件开启(os

  • 涉及到系统级的软件开关,就需要请出我们的os 大哥。通过指定我们软件exe所在的文件路径,os 就能帮我将应用打开。

    py 复制代码
      #注意这里的cmd内的文件路径,\字符需要转义,变成\\
      cmd='你的exe的文件路径'
      myApp = os.popen(cmd)

窗口获取(win32gui

  • 今天的主角win32gui,这个伙伴能够做许多了不起的事情:

    • 通过窗口名获取窗口句柄(获取窗口句柄后我们才能做更多的事情)
    • 通过窗口句柄+窗口下的窗口名,能够构建整个窗口树(也就是你能拿到所有展示在你面前的窗口)
    • 强制聚焦我们选择的窗口句柄(唤起我们想要的窗口)
    • 通过窗口句柄,获取窗口位置和大小(这个对我们的自动化点击非常有帮助)
  • 下一步,我知道我当前应用的窗口叫啥名字呢?**Spy++**是个非常好用的工具。

    • Spy++继承在Visual Studio编辑器下,我们可以通过下载Visual Studio,这里的社区版本也是有带的,位于我们的工具菜单栏下:
    • 打开之后长这样:
    • 完全看不懂咋办?别慌,有搜索工具。点击Spy++窗口上方的搜索按钮\查找窗口:
    • 将瞄准器对准我们想要的窗口就能捕获到我们的窗口了!这时候Spy++列表就能够ping到选择的窗口选项,右键窗口选项,选择属性。打开属性面板,查看对应类名和标题名。

  • 大火烹饪!通过代码将两者串联起来。

    py 复制代码
      #handle为句柄
      handle = win32gui.FindWindow(类名, 标题名)
      #获取handle下的子窗口句柄
      child = win32gui.FindWindowEx(handle, None, 子标题名, None)

模拟点击(pywinauto

  • pywinauto 内有一个mouse对象,能够帮助我们去点击对应的窗口位置,实现基本的鼠标相关操作。

    py 复制代码
      #child是我们上一步骤获取的子窗口句柄,通过GetWindowRect,获取子窗口的位置
      left, top, right, bottom = win32gui.GetWindowRect(child)
      #算好位置
      click_x = left + int((right - left) * 7 / 10)
      click_y = bottom - 40
      #模拟点击位置
      pywinauto.mouse.click(coords=(click_x, click_y))

总结

  • 最后结合我们的Windows进程服务,一个简单的自动化窗口管理器就能够实现了。这里最重要的要点就是成功捕获到窗口句柄,句柄是重要的操作对象。通过句柄,我们能够实现更复杂更繁琐的需求。