0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用win32api实现自动唤醒并截图的操作

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-30 11:13 次阅读

利用Python自带的win32api和win32con、win32gui等模块,我们能执行许多windows下的自动化操作。比如两个窗口的自动点击操作,从软件中的窗口复制文本到txt中,甚至是截图操作。

截图的操作用途最为广泛,你可以用它配合定时工具,定时检测某个程序的运行情况;甚至可以根据截图做一些辅助性的决策,比如玩类似于《连连看》的游戏时,对相同类型的方块进行标记,辅助你玩游戏。

下面就讲讲如何使用 win32api 实现自动唤醒并截图的操作。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

**(可选1) **如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

**(可选2) **此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

请选择以下任一种方式输入命令安装依赖

  1. Windows 环境 打开 Cmd (开始-运行-CMD)。
  2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
  3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install pypiwin32
pip install pillow

2.如何获取窗口坐标

通过 win32gui 的 FindWindow 函数,我们能轻易地找到任何进程的窗口:

import win32api, win32con, win32gui
def get_window_pos(name):
    name = name
    handle = win32gui.FindWindow(0, name)
    # 获取窗口句柄
    if handle == 0:
        return None
    else:
        return win32gui.GetWindowRect(handle)
x1, y1, x2, y2 = get_window_pos('暴雪战网')
print(x1,y1,x2,y2)

结果:

>> python 1.py
# (349,83,1549,1013)

输出结果中的元组即是窗口信息(x1, y1, x2, y2):

(x1, y1)是窗口左上角的坐标。
(x2, y2)是窗口右下角的坐标。

我们可以利用这个信息配合PIL进行截图。但是在这之前,我们还要解决两个问题:

1. 该窗口并不在当前的界面上,被其他的软件覆盖到底层中,这时候需要高亮窗口。

2. 该窗口被最小化怎么办?

2.win32gui 高亮窗口

为了使得被叠在底层的窗口能放到最上层显示,我们需要拿到窗口的handle,对其执行高亮操作。

使用 win32gui 可以非常简单地实现这个特性,我们刚刚获得坐标信息的时候已经得到handle了,调用一个SetForegroundWindow方法即可:

import win32api, win32con, win32gui
def get_window_pos(name):
    name = name
    handle = win32gui.FindWindow(0, name)
    # 获取窗口句柄
    if handle == 0:
        return None
    else:
        # 返回坐标值和handle
        return win32gui.GetWindowRect(handle), handle
(x1, y1, x2, y2), handle = get_window_pos('暴雪战网')
text = win32gui.SetForegroundWindow(handle)

这样就能将被覆盖到底层的窗口放到最上层

3. 还原最小化窗口

还有一种特殊情况就是窗口被缩小了,这时候我们就需要还原最小化窗口,其实也非常简单,只要利用win32gui和win32con向该窗口发送一个信息即可。

import win32api, win32con, win32gui
def get_window_pos(name):
    name = name
    handle = win32gui.FindWindow(0, name)
    # 获取窗口句柄
    if handle == 0:
        return None
    else:
        # 返回坐标值和handle
        return win32gui.GetWindowRect(handle), handle
(x1, y1, x2, y2), handle = get_window_pos('暴雪战网')
win32gui.SendMessage(handle, win32con.WM_SYSCOMMAND, win32con.SC_RESTORE, 0)
# 发送还原最小化窗口的信息
win32gui.SetForegroundWindow(handle)
# 设为高亮

效果如图所示:

图片

4.截图

最后可以试一下我们的完整代码了,针对指定的坐标使用PIL模块进行截图,代码如下:

import win32api, win32con, win32gui

def get_window_pos(name):
    name = name
    handle = win32gui.FindWindow(0, name)
    # 获取窗口句柄
    if handle == 0:
        return None
    else:
        # 返回坐标值和handle
        return win32gui.GetWindowRect(handle), handle
(x1, y1, x2, y2), handle = get_window_pos('暴雪战网')
win32gui.SendMessage(handle, win32con.WM_SYSCOMMAND, win32con.SC_RESTORE, 0)
# 发送还原最小化窗口的信息
win32gui.SetForegroundWindow(handle)
# 设为高亮
from PIL import Image, ImageGrab
img_ready = ImageGrab.grab((x1, y1, x2, y2))
# 截图
img_ready.show()
# 展示

效果如下:

图片

这个功能可好用了,比如说你需要监控一个窗口的运行状况,不可能时时刻刻都去观察它,你可以使用while循环不断调用这个窗口截图脚本,先截图进行保存。

你甚至可以配合定时任务做截图,见我们上篇文章:

Schedule—简单实用的 Python 周期任务调度工具

截图后的图表信息还能够用于分析、辅助决策。举个游戏的例子:当你玩《连连看》的时候,可以截图检测每个方块是否相同,把相同的方块标记出来,提高你的连连看游戏效率。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • WINDOWS
    +关注

    关注

    3

    文章

    3524

    浏览量

    88408
  • 窗口
    +关注

    关注

    0

    文章

    66

    浏览量

    10843
  • 数据分析
    +关注

    关注

    2

    文章

    1427

    浏览量

    34007
  • Win32
    +关注

    关注

    0

    文章

    11

    浏览量

    8111
收藏 人收藏

    评论

    相关推荐

    win32 api参考手册大全

    ,应用程序可以充分挖掘Windows的32位操作系统的潜力。 Mircrosoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用 Win32 API不但可以开
    发表于 10-14 12:37

    MFC类库和Win32API大全(转)

    给大家推荐我在天嵌科技论坛上找到的chm格式的MFC类库和Win32API大全,方便大家查找函数和类库。
    发表于 05-30 09:55

    Win10电脑经常自动掉线、自动断网的解决方法

    “属性”里的“关机 网络唤醒”,在右侧的“值”中选择“开启”,然后确定就行了。以上就是IT33分享的Win10电脑经常自动掉线、自动断网的解决方法,希望能够帮助到!
    发表于 11-28 17:25

    OpenHarmony应用示例:如何在eTS项目中使用screenshot接口获取屏幕截图

    屏幕截图简介此Demo展示eTS项目中如何使用screenshot接口获取屏幕截图实现效果如下:相关概念屏幕截图:提供获取当前屏幕截图
    发表于 08-15 14:50

    windows api大全

    Win32 API是从事Windows应用程序开发所必备的。 首先对Win32 API函数做完整的概述;然后收录五大类函数: 窗口管理、图形设备接口、系统服务、国际特性以
    发表于 10-14 11:48 133次下载
    windows <b class='flag-5'>api</b>大全

    MFC和Win32技术应用分析

    MFC中最重要的封装是对Win32 API的封装,所谓Windows Object(Windows对象)是Win32下用句柄表示的Windows操作系统对象。
    发表于 02-07 11:03 2357次阅读

    基于Win32 API函数和多线程技术的串行通信编程

    运用Win32 API函数和多线程技术,对磁悬浮伺服装置控制系统中PC机与单片机间串行通信进行编程。介绍了开关串口、初始化串口、设置缓冲区、读写串口、重叠I/O操作、监视通信事件等与串行通信编程密切相关的
    发表于 04-18 10:46 6次下载

    网关唤醒终端实现 唤醒下发算法设计

    今天我们来讲讲关于无线通信设计中唤醒下发算法的设计与实现,如何随时唤醒终端,网关和终端约定在一些时间窗口期通。
    发表于 02-17 12:24 2998次阅读
    网关<b class='flag-5'>唤醒</b>终端<b class='flag-5'>实现</b> <b class='flag-5'>唤醒</b>下发算法设计

    如何使用python实现截图自动存入Excel表

    如何使用python实现截图自动存入Excel表
    的头像 发表于 02-05 12:13 7224次阅读

    微软为Win10两项新功能:截图和触屏 无需升级系统!

    。 功能体验包仍需要通过Windows Update的方式获取,本地操作系统版本号也需要在Build 19042.662才可。此番提及的新功能主要涉及两项: 一是新的截图和草图工具(WIN + SHIFT
    的头像 发表于 12-01 09:14 1360次阅读

    微软公布Project Reunion 预览版 v0.1.0,统一 Win32 和 UWP API

    Reunion 统一了对现有 Win32(传统 Windows API)和 UWP(通用 Windows 平台)API 的访问,通过 NuGet 等工具使其与
    的头像 发表于 12-14 09:37 1448次阅读

    鸿蒙系统截图怎么截 在哪里操作

    华为鸿蒙操作系统发布已经过去将近一个月了,那么,华为鸿蒙系统截图怎么截屏?鸿蒙系统截屏方法操作方法介绍如下:
    的头像 发表于 06-25 09:57 8090次阅读

    使用Postman成功实现API测试自动化的最佳实践

      API 测试自动化支持两个独立软件系统之间的通信和数据交换。实现 API 的软件系统包含可由另一个软件系统执行的功能/子例程。它通过增加测试覆盖率和频率来帮助创建更健壮和抗错误的程
    的头像 发表于 06-20 10:19 901次阅读

    使用Postman成功实现API测试自动化的最佳实践

      API 测试自动化支持两个独立软件系统之间的通信和数据交换。实现 API 的软件系统包含可由另一个软件系统执行的功能/子例程。它通过增加测试覆盖率和频率来帮助创建更健壮和抗错误的程
    的头像 发表于 07-05 10:46 929次阅读

    怎么在Python中实现截图功能

    利用Python自带的win32apiwin32con、win32gui等模块,我们能执行许多windows下的自动操作。比如两个窗口的
    的头像 发表于 11-03 15:32 904次阅读
    怎么在Python中<b class='flag-5'>实现</b><b class='flag-5'>截图</b>功能