- python上安装pywin32库
pip install pywin32
- Wincom32 操作Excel
API参考网站 https://docs.microsoft.com/zh-cn/office/vba/api/overview/excel
# -*- coding: utf-8 -*-
import win32com.client
import os
path=os.getcwd()
file_name=path+'\\1.xlsx'
xlsApp=win32com.client.Dispatch("excel.Application") #打开excel程序
xlsApp.Visible=1
try:
xlBook = xlsApp.Workbooks.open(file_name) #打开文件
except:
xlBook = xlsApp.Workbooks.Add() #新建文件
xlBook.SaveAs(file_name) #保存
cell = xlBook.ActiveSheet.Cells(1,1) #修改值
cell.Value='111'
xlBook.Save() #保存操作
- QQ截图功能
最近需要实现一个简易的类似QQ截图功能,百度一圈,两种方法:
- 利用ctypes直接调用老版QQ、微信的dll动态库内的截图函数,需要找到对应的dll文件
import ctypes
def capture():
try:
dll = ctypes.cdll.LoadLibrary('CameraDll.dll')
dll.CameraSubArea(0)
except Exception:
print("Dll load error!")
capture()
- 利用win32API和Tkinter组合截图
网上找到的基本上都是借用win32API截图生成png文件后导入到Tkinter的画布canvas中,利用鼠标画矩形区域进行截图。实际操作发现,卡在了将win32API生成的位图导入到canvas中,百度之,Tkinter仅支持导入gif文件,无解,网上方法均是引入PIL图像操作库进行转换。
转换思维,将截图与Tkinter分开:
在win32API中先进行整体截图存入内存,然后新建一个透明canvas,利用矩形框选择待截图区域,获取其坐标后传入win32API中进行分解图片操作,最终得到截取图片。
Win32API截图程序:
def window_capture(filename,w,h): # w,h为当前显示器宽、高
hwnd = 0
hwndDC = win32gui.GetWindowDC(hwnd)
mfcDC = win32ui.CreateDCFromHandle(hwndDC)
saveDC = mfcDC.CreateCompatibleDC()
saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
saveDC.SelectObject(saveBitMap)
saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY)
saveBitMap.SaveBitmapFile(saveDC, filename)
鼠标画矩形操作:
canvas = tk.Canvas(root,bd=0,bg='white', width=screenWidth, height=screenHeight)
canvas.bind("<ButtonPress-1>", on_button_press) #获取起始点
canvas.bind("<B1-Motion>", on_move_press) #实时获取终点,并刷新矩形
canvas.bind("<ButtonRelease-1>", on_button_release) #完成矩形绘画,获取截图坐标,传入截图函数中
root.bind_all('<KeyPress>',keypress_event) #建立全局ESC退出机制
canvas.pack()
将整体截图进行裁剪:
DC.BitBlt((0, 0), (w, h), saveDC, (x, y), win32con.SRCCOPY)
#x,y为起始点坐标,w,h为宽、高
操作完成后将图片存入剪切版中
#----------图片载入剪切板--------
aString=ctypes.windll.user32.LoadImageW(0,filename,win32con.IMAGE_BITMAP,0,0,win32con.LR_LOADFROMFILE)
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32con.CF_BITMAP,aString)
win32clipboard.CloseClipboard()
最终基本达到QQ截图类似效果~