有时, 需要使用程序自动控制某个窗口, 或者是系统默认的窗口样式太单调, 想换一个样式。
为此, 作者使用tkinter编写了窗口控制工具, 而控制窗口又需要调用API函数。
先展示效果图:

目录

  • 导入ctypes模块
  • 调用API函数
    • 获取窗口句柄
    • 获取/设置窗口标题
    • 最小化/取消最小化
    • 关闭窗口
    • 更改窗体样式
  • 常见问题
  • 总结

导入ctypes模块

ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。导入ctypes模块, 使用如下代码即可:

from ctypes import *

调用API函数

使用ctypes的windll对象可实现调用API函数的功能。

获取窗口句柄

句柄(Handle, 简称hwnd)是一个是用来标识对象或者项目的标识符,可以用来描述窗体、文件等。获取句柄后可实现窗口的控制。

winname = input('输入窗口标题')
hwnd = windll.user32.FindWindowW(c_char_p(None),winname)
print(hwnd)

获取/设置窗口标题

需要使用GetWindowTextW, SetWindowTextW函数。set函数接收2个参数, 分别为句柄和一个字符串。

title=input('输入新标题')
windll.user32.SetWindowTextW(hwnd, title)

get函数还需要一个字符串缓冲区, 使用create_string_buffer创建。

p = create_string_buffer(256)
windll.user32.GetWindowTextW(hwnd,byref(p),256) # 获取窗口标题
title = str(p.raw,encoding='utf-16').strip('\x00') # 解码

最小化/取消最小化

使用了CloseWindow, OpenIcon API函数; 函数接收1个参数, 为hwnd。

# 最小化
windll.user32.CloseWindow(hwnd) # 注意, 不是关闭窗口
# 取消最小化
windll.user32.OpenIcon(hwnd)

关闭窗口

调用SendMessageA函数, 向窗口发送关闭消息即可。

WM_CLOSE = 0x10
windll.user32.SendMessageA(hwnd,WM_CLOSE,0,0)

更改窗体样式

窗体样式分为两类, 分别是GWL_STYLEGWL_EXSTYLE

  1. 获取样式
GWL_STYLE = -16
GWL_EXSTYLE = -20
old1=windll.user32.GetWindowLongA(hwnd,GWL_STYLE),
old2=windll.user32.GetWindowLongA(hwnd,GWL_EXSTYLE)
  1. 设置样式
    使用GWL_STYLEGWL_EXSTYLE可实现多种效果。
    注意: 使用GWL_STYLE时须在第三个参数中加入WS_VISIBLE,使窗口可用。
# 常量
WS_BORDER = 0x800000
WS_CAPTION = 0xC00000 # WS_BORDER Or WS_DLGFRAME
WS_CHILD = 0x40000000
WS_CLIPCHILDREN = 0x2000000
WS_CLIPSIBLINGS = 0x4000000
WS_POPUP = 0x80000000
WS_DLGFRAME = 0x400000
WS_DISABLED = 0x8000000
WS_OVERLAPPEDWINDOW = 0xcf0000
WS_THICKFRAME = 0x40000
WS_VISIBLE = 0x10000000WS_EX_APPWINDOW = 0x40000
WS_EX_DLGMODALFRAME = 0x1
WS_EX_ACCEPTFILES = 0x10
WS_EX_CLIENTEDGE= 0x200
WS_EX_TOOLWINDOW = 0x80
WS_EX_WINDOWEDGE = 0x100# 正常
windll.user32.SetWindowLongA(hwnd, GWL_STYLE, old1)
windll.user32.SetWindowLongA(hwnd, GWL_EXSTYLE, old2)
#无边框
windll.user32.SetWindowLongA(hwnd,GWL_STYLE,WS_VISIBLE+WS_CLIPSIBLINGS+WS_CLIPCHILDREN)
#细边框
windll.user32.SetWindowLongA(hwnd,GWL_STYLE,WS_VISIBLE+WS_CLIPSIBLINGS+WS_CLIPCHILDREN + WS_THICKFRAME))
#边框加粗
windll.user32.SetWindowLongA(hwnd, GWL_EXSTYLE, WS_EX_CLIENTEDGE))
# 工具窗口
windll.user32.SetWindowLongA(hwnd,GWL_EXSTYLE, WS_EX_TOOLWINDOW))

常见问题

  1. 调用API函数, 如GetWindowTextW时, 需要使用create_string_buffer()创建一个字符串缓冲区对象。
  2. 调用API遇到类型错误时, 可修改函数的argtypesrestype属性,如:
from ctypes import *
windll.user32.GetWindowLongA.argtypes = [c_long,c_long]
windll.user32.GetWindowLongA.restype = c_long
windll.user32.GetWindowLongA(hwnd,GWL_STYLE)

另外, 有时需用到函数byref(), 以传递对象的引用。
3. 调用API时可能遇到编码问题, 需要将数据转换成Windows系统默认使用的ANSI编码。

总结

使用ctypes库的windll对象可实现调用各种API函数的功能。
完整源代码见这里: 链接。

Python ctypes模块调用API函数, 制作控制电脑其他窗口工具相关推荐

  1. python调用c函数传字符串参数_Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数...

    在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件 ...

  2. c调用python第三方库_Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递...

    在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件 ...

  3. Python ctypes 调用API函数模拟键盘鼠标事件

    在Python编程中, 有时需要模拟键盘或鼠标事件, 自动操作计算机, 比如玩游戏等. 本文介绍使用ctypes模块调用API函数, 模拟键盘鼠标事件的方法. 目录 1.导入ctypes模块 2.通过 ...

  4. linux 下的动态库制作 以及在python 中如何调用 c 函数库

    linux 下的动态库制作 以及在python 中如何调用 c 函数库 动态库: 动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序 ...

  5. 聊聊Python ctypes 模块(转载)

    聊聊Python ctypes 模块(转载) https://zhuanlan.zhihu.com/p/20152309?columnSlug=python-dev 作者:Jerry Jho 链接:h ...

  6. python ctypes模块安装_ctypes模块扩展python

    文章1 前言 朋友的公司是做GPS的,上周联系到我要帮做个程序把他们平台的车辆定位跟踪数据和省里的平台对接.看一下官方提供的三个文档,洋洋洒洒共一百多页,一大堆协议的定义甚是齐全,好在官方的文件中也带 ...

  7. python 微信模块_Python使用itchat模块实现简单的微信控制电脑功能示例

    本文实例讲述了python使用itchat模块实现简单的微信控制电脑功能.分享给大家供大家参考,具体如下: #!/usr/bin/python #coding=UTF-8 import request ...

  8. python常用模块-调用系统命令模块(subprocess)

    python常用模块-调用系统命令模块(subprocess) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. subproces基本上就是为了取代os.system和os.spaw ...

  9. [python3 实用教程]使用ctypes模块调用运行c代码

    [python3 实用教程]使用ctypes模块调用运行c代码 创建c文件 demo.c: #include<stdio.h>long my_app(long a){long ret = ...

  10. python操作微信电脑版_Python使用itchat模块实现简单的微信控制电脑功能示例

    本文实例讲述了Python使用itchat模块实现简单的微信控制电脑功能.分享给大家供大家参考,具体如下: #!/usr/bin/python #coding=UTF-8 import request ...

最新文章

  1. x is y python_Python 基础
  2. 目标检测分割--BlitzNet: A Real-Time Deep Network for Scene Understanding
  3. 深度报告:一文看懂生物芯片产业
  4. How good software makes us stupid?
  5. Docker的运行机制
  6. 2015 跨年博文总结
  7. 使用SAP Spartacus的route给标准页面维护alias入口
  8. POJ 2777 - Count Color(线段树区间更新+状态压缩)
  9. html5 下拉树,HTML5拖拽API实现vue树形拖拽组件
  10. PBRT-V3体渲染笔记
  11. 明星也爱字体——赵丽颖秀气字体:(江湖少女两版)蓄势待发
  12. Web端微信授权登录
  13. 基本的信号——Sa函数(抽样信号)
  14. Windows 电源计划设置关闭显示器不起作用的解决方法
  15. 基于主从博弈的智能小区代理商定价策略及电动汽车充电管理
  16. rtl8821cu 驱动编译
  17. 中软防水坝 怎么卸载_卸载中软防水墙软件
  18. Spark写入Hudi报分区列乱码问题java.net.URISyntaxException: Illegal character in path at index 46:
  19. 开机黑屏显示html,电脑开机黑屏只显示光标怎么办?来看看几种原因分析及解决方法!...
  20. python拨打网络电话_python 网络电话

热门文章

  1. 大数据技术原理与应用学习笔记(八)
  2. (转发)详解汽车UDS诊断协议(一)
  3. 河南大学软件学院宿舍楼综合布线设计方案
  4. 2022国二计算机office 考试考试秘籍总结大全
  5. win7便签的cheat sheet
  6. 【光学】基于Matlab模拟光流场
  7. No module named ‘win32com‘
  8. 深信服 adesk linux 客户端,Sangfor-aDesk巡检工具(深信服桌面云智能交付巡检助手)V2.1 正式版...
  9. 玩客云服务器怎么卖,玩客云使用教程;低价NAS怎么打造;玩客云现在还值得入手吗?-聚超值...
  10. Wendy Shijia 的「 Escher‘s Gallery」可视化作品复现系列文章(三)