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

直接上代码:

# coding=utf-8
import win32con
import win32api
import win32gui
import win32ui
from ctypes import *
from ctypes import wintypes GetForegroundWindow = windll.user32.GetForegroundWindow
GetWindowRect = windll.user32.GetWindowRect
SetForegroundWindow = windll.user32.SetForegroundWindow
GetWindowText = windll.user32.GetWindowTextA
MoveWindow = windll.user32.MoveWindow
EnumWindows = windll.user32.EnumWindows class 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 = None
self.win_title = '' def bindActiveWindow(self):
"""
函数功能:获取当前焦点所在窗口
"""
self.win_hd = GetForegroundWindow() def bindWindowByName(self, win_name):
"""
函数功能:根据窗体名获取窗体句柄
"""
self.win_title = win_name
pro_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 None
rect=RECT()
GetWindowRect(self.win_hd,byref(rect))
return rect def toScreenPos(self, x,y):
"""
函数功能:将窗体内部坐标转换为相对于显示屏的绝对坐标
"""
#未指定窗口,则结束函数
if self.win_hd is None:
return None
rect=self.getWinRect()
#指定的坐标不在窗体内,则结束函数
if x < 0 or y < 0 or x > rect.right or y > rect.bottom:
return None
pos = POINT()
pos.x = x + rect.left
pos.y = y + rect.top
return pos def toWindowPos(self,x,y):
"""
函数功能:将绝对坐标转换成相对于窗体内部坐标
"""
if self.win_hd is None:
return None
rect = self.getWinRect()
pos = POINT()
pos.x = x - rect.left
pos.y = y - rect.top
# 指定的坐标不在窗体内,则结束函数
if pos.x < 0 or pos.y < 0 or pos.x > rect.right or pos.y > rect.bottom:
return None
return pos def WindowActive(self):
"""
函数功能:将窗体置前
"""
if self.win_hd is None:
return None
SetForegroundWindow(self.win_hd) def getHWND(self):
return self.win_hd def getWinTitle(self):
"""
函数功能:获取窗体的标题
"""
if self.win_hd is None:
return None
buffer = create_string_buffer(255,'\0')
GetWindowText(self.win_hd,buffer,255)
value=buffer.value.decode('gbk')
return value def MoveTo(self,x,y):
"""
函数功能:移动窗体到指定坐标位置
"""
if self.win_hd is None:
return None
rect = 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 None
rect = self.getWinRect()
if w == 0:
w = rect.right - rect.left
if h == 0:
h = rect.bottom - rect.top
if x < 0 or y < 0 or (x+w) > rect.right or (y+h) > rect.bottom:
return None
self.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 None
rect = self.getWinRect()
if w == 0:
w = rect.right - rect.left
if h == 0:
h = rect.bottom - rect.top
if x < 0 or y < 0 or (x+w) > rect.right or (y+h) > rect.bottom:
return None
return 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获取memDC
srcdc = win32ui.CreateDCFromHandle(hwndDC)
# memDC创建可兼容的DC
saveDC = 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 = hwnd
print(self.win_hd)
return False
return True

测试代码:

import FormApi
import time if __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)

Python窗体操作函数的更多相关文章

  1. Python文件操作函数os.open、io.open、内置函数open之间的关系

    Python提供了多种文件操作方式,这里简单介绍os.open.io.open.内置函数open之间的关系: 一.内置函数open和io.open实际上是同一个函数,后者是前者的别名: 二.os.op ...

  2. Python基础操作-函数

    本节内容 1. 函数基本语法及特性2. 参数与局部变量3. 返回值4.递归5.高阶函数 1.函数基本语法及特性函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具 ...

  3. Python 文件操作函数

    这个博客是 Building powerful image classification models using very little data 的前期准备,用于把图片数据按照教程指示放到规定的文 ...

  4. python——列表操作函数和方法

    1.添加新元素 1.1 append()函数 描述:append() 方法用于在列表末尾添加新的对象. 语法:list.append(obj) 参数:obj -- 添加到列表末尾的对象. 返回值:该方 ...

  5. Python 字符串操作函数一

    #-*- coding:utf-8 -*- strword = "i will fly with you , fly on the sky ." #find print(strwo ...

  6. python——字符串操作函数

    字符串 join() map() split() rsplit() splitlines() partiton() rpartition() upper() lower() swapcase() ca ...

  7. Python 字符串操作函数二

    #-*- coding:utf-8 -*- line = "l want watch movie with you ." print(line.center(50)) print( ...

  8. Python文件操作与函数目录

    文件操作 python文件操作 函数 Python函数学习——初步认识 Python函数学习——作用域与嵌套函数 Python函数学习——匿名函数 python内置函数 Python函数学习——递归 ...

  9. python 集合、函数和文件操作

    1.set集合 set集合是一个无序.不可重复.可嵌套的序列,基本功能是进行成员关系测试和删除重复元素,可以使用大括号({})或者 set()函数创建集合,注意:创建一个空集合必须用 set() 而不 ...

随机推荐

  1. mySql 常用命令 | 珠峰培训例子

    show databases; use mhxy; select database(); show tables; desc account_list_175; ),(); select from_u ...

  2. kvo与runtime

    创建新类 添加方法 isa-swizzling 测试方案: 添加全局断点 objc_allocateClassPair objc_registerClassPair class_addMethod l ...

  3. React Core Features

    React Core Features Here is a summary of the core features. We will cover each feature in detail thr ...

  4. SC CSP-J2019初赛成绩已出!

    链接: https://pan.baidu.com/s/1UK2pL7UW0n0vYpnzMbJm9A 提取码: uwav 复制这段内容后打开百度网盘手机App,操作更方便哦 Me?87! I am  ...

  5. python神器——Anaconda的安装与优化配置

    python 对于初学者来说,原版的python在使用的时候非常麻烦,特别是在添加库.升级库的时候总是会报好多错误,缺这缺那.但是自从有了Anaconda以后,妈妈再也不用担心我用不了python啦! ...

  6. [RN] React Native 使用 FlatList 和 ScrollView 的下拉刷新问题

    React Native 使用 FlatList 和 ScrollView 实现 下拉刷新时,RefreshControl 控件不起作用, 后来经查明,原来 RefreshControl 要加在 Sc ...

  7. python 获取文件运行路径

    import os print(os.getcwd()) print("/".join(os.path.dirname(os.path.abspath(__file__)).spl ...

  8. 二叉树 B-树B+树

    聚集索引和非聚集索引结构参考:http://blog.csdn.net/cangchen/article/details/44818623 前两天有位朋友邀请我回答个问题,为什么 MongoDB (索 ...

  9. Features Track[STL map]

    目录 题目地址 题干 代码和解释 参考 题目地址 Features Track(ACM-ICPC 2018 徐州赛区网络预赛 ) 题干 代码和解释 题意:一个动画有许多 n 帧,每帧有 k 个点,点的 ...

  10. spring boot整合websocket之使用自带tomcat启动项目报错记录

    项目中用到websocket,就将原来写好的websocket工具类直接拿来使用,发现前端建立连接的时候报404,经查找发现是因为原来用的是配置的外部tomcat启动,这次是spring boot自带 ...