实现了一个window下对窗体操作的类,实现的功能如:移动窗体、获取窗体位置和大小、截取窗体图片、坐标转换等。

直接上代码:

# coding=utf-8
import win32con
import win32api
import win32gui
import win32ui
from ctypes import *
from ctypes import wintypesGetForegroundWindow = windll.user32.GetForegroundWindow
GetWindowRect = windll.user32.GetWindowRect
SetForegroundWindow = windll.user32.SetForegroundWindow
GetWindowText = windll.user32.GetWindowTextA
MoveWindow = windll.user32.MoveWindow
EnumWindows = windll.user32.EnumWindowsclass RECT(Structure):_fields_ = [('left', c_long),('top', c_long),('right', c_long),('bottom', c_long)]class POINT(Structure):_fields_ = [('x', c_long),('y', c_long),]class FormControl(object):def __init__(self):self.win_hd = Noneself.win_title = ''def bindActiveWindow(self):"""函数功能:获取当前焦点所在窗口"""self.win_hd = GetForegroundWindow()def bindWindowByName(self, win_name):"""函数功能:根据窗体名获取窗体句柄"""self.win_title = win_namepro_fun_type = CFUNCTYPE(c_bool, c_int, c_long)pro_fun_p = pro_fun_type(self.EnumWindowsProc)EnumWindows(pro_fun_p, None)def getWinRect(self):"""函数功能:获取窗体的位置和大小"""if self.win_hd is None:return Nonerect=RECT()GetWindowRect(self.win_hd,byref(rect))return rectdef toScreenPos(self, x,y):"""函数功能:将窗体内部坐标转换为相对于显示屏的绝对坐标"""#未指定窗口,则结束函数if self.win_hd is None:return Nonerect=self.getWinRect()#指定的坐标不在窗体内,则结束函数if x < 0 or y < 0 or x > rect.right or y > rect.bottom:return Nonepos = POINT()pos.x = x + rect.leftpos.y = y + rect.topreturn posdef toWindowPos(self,x,y):"""函数功能:将绝对坐标转换成相对于窗体内部坐标"""if self.win_hd is None:return Nonerect = self.getWinRect()pos = POINT()pos.x = x - rect.leftpos.y = y - rect.top# 指定的坐标不在窗体内,则结束函数if pos.x < 0 or pos.y < 0 or pos.x > rect.right or pos.y > rect.bottom:return Nonereturn posdef WindowActive(self):"""函数功能:将窗体置前"""if self.win_hd is None:return NoneSetForegroundWindow(self.win_hd)def getHWND(self):return self.win_hddef getWinTitle(self):"""函数功能:获取窗体的标题"""if self.win_hd is None:return Nonebuffer = create_string_buffer(255,'\0')GetWindowText(self.win_hd,buffer,255)value=buffer.value.decode('gbk')return valuedef MoveTo(self,x,y):"""函数功能:移动窗体到指定坐标位置"""if self.win_hd is None:return Nonerect = self.getWinRect()MoveWindow(self.win_hd,x,y,rect.right-rect.left,rect.bottom-rect.top,True)def WinCapture(self,path,x,y,w,h):"""函数功能:抓取窗体截图,并保存到文件参    数:path 保存路径x 截取起始x坐标(窗体内相对坐标)y 截取起始y坐标(窗体内相对坐标)w 截取宽度,为0则取窗体宽度h 截取长度,为0则取窗体高度"""if self.win_hd is None:return Nonerect = self.getWinRect()if w == 0:w = rect.right - rect.leftif h == 0:h = rect.bottom - rect.topif x < 0 or y < 0 or (x+w) > rect.right or (y+h) > rect.bottom:return Noneself.Capture(self.win_hd,path,x,y,w,h,0)def WinCapture_Mem(self,x,y,w,h):"""函数功能:抓取窗体截图,并返回图像内存数据参    数:x 截取起始x坐标(窗体内相对坐标)y 截取起始y坐标(窗体内相对坐标)w 截取宽度,为0则取窗体宽度h 截取长度,为0则取窗体高度"""if self.win_hd is None:return Nonerect = self.getWinRect()if w == 0:w = rect.right - rect.leftif h == 0:h = rect.bottom - rect.topif x < 0 or y < 0 or (x+w) > rect.right or (y+h) > rect.bottom:return Nonereturn self.Capture(self.win_hd,'',x,y,w,h,1)def Capture(self, hd, path, x, y, w, h, mode):"""函数功能:截图参    数:hd 截取的窗口句柄path 保存路径x 截取起始x坐标(窗体内相对坐标)y 截取起始y坐标(窗体内相对坐标)w 截取宽度,为0则取窗体宽度h 截取长度,为0则取窗体高度mode 保存模式 0:保存为图片,1:返回图像字节数据"""# 根据窗口句柄获取窗口的设备上下文hwndDC = win32gui.GetWindowDC(self.win_hd)# 根据窗口的DC获取memDCsrcdc = win32ui.CreateDCFromHandle(hwndDC)# memDC创建可兼容的DCsaveDC = srcdc.CreateCompatibleDC()# 创建bigmap准备保存图片saveBitMap = win32ui.CreateBitmap()# 为bitmap开辟空间
        saveBitMap.CreateCompatibleBitmap(srcdc, w, h)# 高度saveDC,将截图保存到saveBitmap中
        saveDC.SelectObject(saveBitMap)# 截取从左上角(0,0)长宽为(w,h)的图片
        saveDC.BitBlt((0, 0), (w, h), srcdc, (x, y), win32con.SRCCOPY)if mode == 0:saveBitMap.SaveBitmapFile(saveDC, path)else:signedIntsArray = saveBitMap.GetBitmapBits(True)return signedIntsArray# 释放内存
        srcdc.DeleteDC()saveDC.DeleteDC()win32gui.ReleaseDC(self.win_hd,hwndDC)win32gui.DeleteObject(saveBitMap.GetHandle())def EnumWindowsProc(self,hwnd, lParam):buffer = create_string_buffer(255,'\0')GetWindowText(hwnd,buffer,255)value=buffer.value.decode('gbk')if value == self.win_title:self.win_hd = hwndprint(self.win_hd)return  Falsereturn True

测试代码:

import FormApi
import timeif __name__== '__main__':time.sleep(2)form=FormApi.FormControl()form.bindActiveWindow()rect=form.getWinRect()print("坐标:(x:%d,y:%d),大小:(width:%d,height:%d)" % (rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top))time.sleep(2)form.WinCapture(r'c:\1.bmp',0,0,200,200)

转载于:https://www.cnblogs.com/WushiShengFei/p/11065778.html

Python窗体操作函数相关推荐

  1. python列表操作函数大全_Python列表操作函数

    列表可以进行多个数据的存储,同时python中的列表设计非常到位,它可以实现内容动态扩充,可以进行后期数据的删除,这些就需要通过Python提供的列表操作函数来实现了. 对于Python语言而言,开发 ...

  2. python - 文件操作函数练习

    练习题 文件处理相关 编码问题 请说明python2 与python3中的默认编码是什么? # 答案py2默认ASCII码,py3默认的utf8 为什么会出现中文乱码?你能列举出现乱码的情况有哪几种? ...

  3. python目录操作函数_Python3目录操作

    Python3 目录操作 常见的目录操作: 显示当前目录 切换目录 新建.删除目录.移动.复制 显示目录内容 判断目录.文件是否存在 目录操作常用的函数如下: os.listdir() # 列出目录下 ...

  4. python文件操作函数_python基础之文件操作,集合,函数

    文件操作: 打开文件的方法: 第一种:打开文件执行完命令后,需要关闭文件,否则会一直占用内存空间 f=open('/data/1.txt','r+') #后面的r+ 表示打开文件的模式是读写 #命令 ...

  5. python字符串操作函数总结

    1.字符串基本操作: 操作格式/函数名称 功能 参数 返回值 范例 变量名[idx] 关键词: 获取单个字符 获取字符串中指定索引位置的字符 idx:要获取的索引位置 结果是包含了单个字符的字符串 i ...

  6. python序列操作函数有哪些_Python笔记--序列操作函数

    1All(): 判断给出的可迭代参数iterable中所有元素是否均为true,是则返回true,否则返回false.注:除了0,空,False外都算作true.空元组,空列表返回true. 语法:a ...

  7. python字典操作函数_【python】字典的操作方法和函数

    一.字典内置函数&方法 Python字典包含了以下内置函数: 1.cmp(dict1, dict2):比较两个字典元素. 2.len(dict):计算字典元素个数,即键的总数. 3.str(d ...

  8. python炸裂操作函数explode

    explode函数使用 现有一个csv文件记录课程,数据格式如下图: 现要把每星期的课程拆出来,形成每个课程单独一行的格式(类似一维表) 星期 课程 周一 历史 周一 生物 - - 实现代码 # -* ...

  9. Python元组操作函数

    元组(tuple)与列表(list)用法非常相似,但有以下本质区别: 1. 元组使用圆括号,而列表使用方括号: 2. 元组不可改变(增.删.改),而列表可以改变. >>> tup1 ...

最新文章

  1. ABAP动态生成经典应用之Dynamic SQL Excute 程序
  2. 【科普】boy and girl,你是不是对算法工程师有误解
  3. ITK:使用FFT与输入图像的掩码图像进行归一化相关
  4. Xshell显示中文乱码问题
  5. 给后辈的一点建议,面试建议
  6. 工作312:uni-时间戳处理
  7. 分享GitHub上一些嵌入式相关的高星开源项目
  8. Flink-org.apache.flink.streaming.api.windowing.windows.Window
  9. 转载:EM算法的最精辟讲解
  10. brew安装软件时报错
  11. 关于DBC文件的格式解析(转)
  12. 9008刷机 小米max2_小米Max2解锁教程_小米Max2一键解锁BL的方法
  13. pytorch 入门教程 常用知识整理
  14. 达人评测 华为手表 WATCH 3怎么样
  15. Java使用poi-tl生成word文档
  16. ubuntu服务器上,求生之路2服务器如何把监听地址改为0.0.0.0
  17. acpi debug in Linux kernel
  18. python爬虫——基础知识
  19. 简约大气昼夜wordpress免费导航主题
  20. php 解析word文件,php解析word文档

热门文章

  1. jQuery进阶部分笔记
  2. WN7 上IIS7运行asp+access网站出现错误: ADODB.Connection 错误 '800a0e7a'未找到提供程序。该程序可能未正确安装
  3. [概率论]如何通俗地理解“最大似然估计法”?
  4. python最小公倍数 菜鸟_Python实现的求解最小公倍数算法示例
  5. threadpoolexecutor参数_ThreadPoolExecutor的使用
  6. 计算机视觉基础-图像处理(图像分割/二值化)cpp+python
  7. mysql的root密码的变更-进程的杀掉
  8. Android和Linux kernel发展史
  9. android list 替换元素_Java 集合(二)——Set 集合、List 集合和 Collections 工具类...
  10. wincc服务器系统,什么情况下用wincc服务器与客户端