Win32com随笔 (Python)

  • 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截图功能,百度一圈,两种方法:
  1. 利用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()
  1. 利用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截图类似效果~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。