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

    文章

    3440

    浏览量

    87144
  • 窗口
    +关注

    关注

    0

    文章

    62

    浏览量

    10728
  • 数据分析
    +关注

    关注

    2

    文章

    1352

    浏览量

    33737
  • Win32
    +关注

    关注

    0

    文章

    11

    浏览量

    8081
收藏 人收藏

    评论

    相关推荐

    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

    STM32实现待机唤醒

    STM32实现待机唤醒 寄存器版上篇使用了库函数实现 待机唤醒本文将使用寄存器版本实现关机模式寄存器版本跟库函数版本
    发表于 08-17 09:10

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

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

    W21H2-1-3-0是否有从应用程序访问GPIO驱动程序的应用程序示例代码?

    ?2.要从应用程序访问 UART 驱动程序,我应该使用 WIN32API 使用 CreateFile、WriteFile、ReadFile 和 CloseHandle 函数创建它吗? 如果存在示例代码,我如何获得它?
    发表于 04-03 06:40

    MFC和Win32技术应用分析

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

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

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

    Win32API实现PC机与多单片机的串行通信

    的实际经验,介绍在32位Windows操作系统下,用VC十+6.0和MCS-51汇编语言来开发PC机和多MCS-51单片机通信软件的一些技巧和方法。
    发表于 02-02 17:15 1次下载
    用<b class='flag-5'>Win32API</b><b class='flag-5'>实现</b>PC机与多单片机的串行通信

    Win 8变脸为兼容触摸操作

    关键词: Win 8 , 触摸操作 微软公司在美国纽约宣布,最新的Windows 8(简称Win 8)操作系统正式上市。国内用户只能从现有的操作
    发表于 11-24 00:29 263次阅读

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

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

    微软持续改进Win32 API语言易用性和兼容性 包括C#和Rust

    Win32 API 是被诸多 Windows 桌面应用程序所使用的经典原生开发接口,并且支持直接访问相关硬件和系统功能。对于 C / C++ 开发者来说,Win32 API 的易用性还
    的头像 发表于 01-22 17:05 1843次阅读

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

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

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

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

    怎么在Python中实现截图功能

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