Pywin32 设备

win32print

  • 参数
    • level:返回信息类型
      • 1:列表,无值含义说明
      • 2-5:内容逐渐省略的字典,键值对表示值含义、值
    • hPrinterwin32print.OpenPrinter 返回的打印机句柄
    • hdcwin32gui.CreateDC 返回打印机设备上下文句柄
    • pPrinterwin32print.GetPrinter 返回的 PRINTER_INFO_* 字典

打印机

  • win32print.OpenPrinter(printer, Defaults):获取指定打印机的句柄
  • win32print.GetPrinter(hPrinter, Level):获取打印机相关信息
    • Level:信息展示格式,一般设置为 2 以字典形式返回
  • win32print.GetDevicesCaps(hdc, Index):获取设备上下文相关的参数、设置
    • Index 参数代号,可以通过 win32con. 获取
    • 将打印机句柄作为 hdc 传递时,正常执行但返回结果始终为 0
  • win32print.SetPrinter(hPrinter, Level, pPrinter, Command):改变打印机配置、状态
    • Command:发送给打印机的命令,可以通过 win32print.PRINTER_CONTROL_* 查看
  • win32print.EnumPrinters(flags, name, level):枚举打印机
    • flags:指定打印机类型,可以通过 win32print.PRINTER_ENUM_<type> 获取相关类型枚举值
      • 可设置为 6 以枚举 localconnections 类型设备
  • win32print.GetDefaultPrinter/win32print.GetDefaultPrinterW
  • win32print.SetDefaultPrinter/win32print.SetDefaultPrinterW

打印机属性设置

  • 打印机属性设置方式

    1
    2
    3
    4
    5
    6
    // 获取打印相关属性
    properties = win32print.GetPrinter(hPrinter, 2)
    devmode = properties["pDevMode"]
    // 修改属性设置
    properties["pDevMode"] = devmode
    win32print.SetPrinter(hPrinter, 2, properties, 0)
  • 打印机属性常用设置

    • devmode.Color:彩印
      • 可通过 win32con.DMCOLOR_<XXX> 查看枚举值
    • devmode.PaperSize:纸张尺寸
      • 可以通过 win32con.DMPAPER_<XXXX> 查看枚举值
      • 指定此属性时,devmode.PaperLengthdevmode.PaperWidth 不生效
    • devmode.PaperLength:纸张长,单位毫米
    • devmode.PaperWidth:纸张宽,单位毫米
    • devmode.Duplex:单双面(双面分为 flip overflip up
      • 可通过 win32con.DMDUP_<XXXX> 查看枚举值
    • devmode.Orientation:打印方向,即横向、纵向
      • 可通过 win32con.DMORIENT_<XXXX> 查看枚举值
      • 真实打印时影响不大,打印至 pdf 文件时、双面打印时有影响
    • devmode.MediaType:纸张类型
    • devmode.DefaultSource:纸张来源

打印

GDI 打印

  • win32print.StartDocPrinter(hPrinter, level, tuple):通知打印 spool 将有文件加入
    • hPrinterwi32print.OpenPrinter 返回的打印机句柄
    • level:文档信息结构,此处仅支持 1 (元组)
    • tuple:按 level 指定格式设置的文档信息
      • docName:文档名
      • outputFile:输出文件名
      • dataType:文档数据类型
  • win32print.EndDocPrinter(hPrinter):结束打印机的打印任务
    • win32print.WriterPrinter 调用后使用
  • win32printer.AbortPrinter(hPrinter):删除打印机的 spool 文件
  • win32print.StartPagePrinter(hPrinter):通知打印 spool 一页将被打印
  • win32print.EndPagePrinter(hPrinter):结束打印 job 中的一页
  • win32print.WritePrinter(hPrinter, buf):将 buf 复制到打印机
    • 适合复制 raw PostscriptsHPGL 文件

GDI 打印

  • win32print.StartDoc(hdc, docinfo):在打印机设备上下文上开始 spooling 打印任务
    • hdcwin32gui.CreateDC 返回的设备上下文句柄
    • docinfo:指定打印任务参数,四元组
      • DocName:文档名
      • Output:输出文件名,仅在输出至文件时需要,正常打印时可设置为 None
      • DataType:数据类型,如:RAWEMF、TEXTNone` 使用默认
      • Type:操作模式,可选值 DI_APPBANDINGDI_ROPS_READ_DESTINATION0
  • win32print.EndDoc(hdc, docinfo):在打印机设备上下文上结束 spooling 打印任务
  • win32print.AbortDoc(hdc):取消打印 job
  • win32print.StartPage(hdc):在打印机设备上下文上开始一页
  • win32print.EndPage(hdc):在打印机设备上下文上结束一页

打印任务

  • win32print.EnumJobs(hPrinter, FirstJob, NoJobs, Level):枚举打印机上的打印 job
  • win32print.GetJob(hPrinter, JobID, Level):获取打印 job 的信息
  • win32print.SetJob(hPrinter, JobID, Level, JobInfo, Command):暂停、取消、恢复、设置优先级
    • Command:指定设置的内容,可以通过查询 win32print.JOB_CONTROL_<XXXX> 查看枚举值

打印示例

图片打印

  • 直接使用 win32gui.CreateDC

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 创建打印机上下文
    hdc = win32gui.CreateDC("WINSPOOL", printer_name, None)
    # 打开图像文件,并创建位图
    bmp = Image.Open(filename)
    dib = ImageWin.Dib(bmp)
    # 在上下文上打开文件、文件页
    win32print.StartDoc(hdc, 1, ("", None, None, 0))
    win32print.StartPage(hdc)
    # 绘制位图
    dib.draw(hdc, (x1, y1, x2, y2))
    win32print.EndPage(hdc)
    win32print.EndDoc(hdc)
    win32gui.DeleteDC(hdc)
  • 使用 win32ui.CreateDC

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 创建未初始化设备上下文
    hdc = win32ui.CreateDC()
    # 初始化上下文
    hdc.CreatePrinterDC(printer_name)
    hdc.StartDoc(filename)
    hdc.StartPage()
    bmp = Image.Open(filename)
    dib = ImageWin.Dib(bmp)
    # 获取句柄,并绘制
    dib.draw(hdc.GetHandleOutput(), (x1, y1, x2, y2))
    hdc.EndPage()
    hdc.EndDoc()
    hdc.DeleteDC()
  • 结合 win32gui.CreateDCwin32ui.CreateDC

    1
    2
    3
    4
    # 可以设置 `PDEVMODE`
    g_hdc = win32gui.CreateDC("WINSPOOL", printer_name, dev_mode)
    hdc = win32gui.CreateDCFromHandle(g_hdc)
    # 之后同上

Pywin32 应用模块

win32com

win32com.client

win32com.client.Dispatch

Word.Application

  • 创建、打开文档

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 应用对象:word应用
    app = win32com.client.Dispatch("Word.Application")
    # 文档对象
    doc = app.Documents.add()
    doc = app.Documents.Open("/path/to/file")
    # 窗口对象:文档可以在多个窗口中展示(`View`栏中可找到)(不是打开两次文档)
    window = app.windows(winNo)
    window = doc.windows(winNo)
    # 视图对象:窗口的视图属性(全部显示,域底纹,表格虚框)
    view = window.view
  • Selection 对象:选区,文档中高亮的选择区域、插入点

    • 每个窗口有自身的 Selection
    • 窗口和相应的 Selection 同时只有一个被激活
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # 当前激活窗口的选区
    s = app.Selection()
    # 1窗口的选区
    s1 = app.Windows(1).Selection
    # 替换选区内容,选区变为输入文本整体
    s.Text = "Hello, world!"
    # 输入内容,选区变为文本后插入点
    s.TypeText("hello, world!")
    # 拷贝选区
    s.Copy()
    # 粘贴内容至选区
    s.Paste()
    # 变换选区
    s.Start = 0
    s.End = 1
    # 删除
    s.Delete()
    # 全选
    s.WholeStory()
    # 移动选区:<wdunits>:移动单位:1-字符,
    s.MoveLeft(<wdunits>, <nums>)
    s.MoveRight()
  • Range 对象:连续区域,由 <start><end> 位置定义

    • 区分文档不同部分
    • Range 独立于 Selection
    • 可以定义多个 Range
    • 属性、方法类似 Selection
    1
    2
    r = doc.Range(<start>, <end>)
    r = s.Range()
  • Font 对象:字体属性(名称、字号、颜色等)

    1
    2
    3
    4
    font = s.Font
    font = r.Font
    font.name = "仿宋"
    font.size = 16
  • ParagraphFormat 对象:段落格式(对齐、缩进、行距、边框底纹等)

    1
    2
    3
    4
    5
    6
    7
    8
    pf = s.ParagraphFormat
    pf = r.ParagraphFormat
    # 对齐方式:0-左对齐,1-居中对齐,2-右对齐
    pf.Alignment = 0
    # 行间距:0-单倍,1-1.5倍,2-双倍
    pf.LineSpacingRule = 0
    # 左缩进:单位:磅
    pf.LeftIndent = 21
  • PageSetup 对象:页面设置(左边距、右边距、纸张大小)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ps = doc.PageSetup
    ps = s.PageSetup
    ps = r.PageSetup
    # 上边距:单位:磅(1cm = 28.35磅)
    cm2pound = 28.35
    ps.TopMargin = 79
    # 页面大小:6-A3,7-A4
    ps.PageSize = 7
    # 布局模式
    ps.LayoutMode = 1
    # 行字符数
    ps.CharsLine = 28
    # 行数:自动设计行间距
    ps.LinesPage = 22
  • 样式集:文档中内置、用户定义的样式

    1
    2
    3
    4
    5
    styles = doc.Styles
    # 获取样式:-1-正文,-2-标题1,-3-标题2,-4-标题3,-32-页眉,-63-标题
    normal = styles(-1)
    normal.Font.Name
    normal.Font.Size = 16

Pywin32 图形化模块

win32gui

  • win32gui 提供对原生 win32 GUI API 的接口

Device Context

  • win32gui.CreateDC(Driver, Device, InitData):为打印机、显示器创建设备上下文
    • Driver:显示器、打印机供应商名称
    • Device:设备名,如打印机名称
    • InitDataPyDEVMODE 指定打印参数
  • win32gui.CreateCompatibleDC(hdc):创建兼容指定设备的内存设备上下文
    • hdc:上下文句柄
  • win32gui.SetMapMode(hdc, MapMode):设置逻辑(页空间)单位至设备(空间)单位的映射方式
    • MapMode:映射方式,可通过 win32con.MM_<XXXX> 查看枚举值
  • win32gui.SetViewportExtEx(hdc,XExtent,YExtent):设置 DC 可视区域的 extent
    • XExtent/YExtentX/Y 方向逻辑长度
  • win32gui.SetWindowExtEx(hdc,XExtent,YExtent):设置 DC 窗口的长度
  • win32gui.SetWindowOrg(hdc,X,Y):设置 DC 可视区域起始位置
    • X/YX/Y 方向的逻辑坐标
  • 设置逻辑长度即将 DC 的可视区域空间进行线性变换(映射),而避免对需展示信息进行线性变换
  • viewport 是整个可视区域,window 是可是区域中用于展示信息的部分,windowOrg 则是 window 在信息中的偏移

窗口

  • win32gui.EnumWindows(callback, ctx):遍历所有窗口

    1
    2
    3
    4
    5
    6
    def winEnumHandler(hwnd, ctx):
    if win32gui.IsWindow(hwnd) and win32gui.IsWindowsEnabled(hwnd) and wind32gui.IsWindowVisible(hwnd):
    print(hwnd, win32gui.GetWindowText(hwnd))
    ctx.append(hwnd)
    hwnd_list = []
    win32gui.EnumWindows(winEnumHandler, hwnd_list)
  • win32gui.EnumChildWindows(parent_hwnd, callback, ctx):遍历窗口的子窗口

  • win32gui.ShowWindow(hwnd, status):根据status设置窗口状态

    |常量|大小|显示状态|激活状态| |——-|——-|——-|——-| |win32con.SW_HIDE|不变|隐藏|不变| |win32con.SW_MAXSIZE|最大化|不变|不变| |win32con.SW_MINISIZE|最小化|不变|不变| |win32con.SW_RESTORE|恢复正常|不变|不变| |win32con.SW_SHOW|不变|显示|激活| |win32con.SW_SHOWMAXIMIZED|最大化|显示|激活| |win32con.SW_SHOWMINIMIZED|最小化|显示|激活| |win32con.SW_SHOWNORMAL|恢复正常|显示|激活| |win32con.SW_SHOWMINNOACTIVE|最小化|显示|不变| |win32con.SW_SHOWNA|不变|显示|不变| |win32con.SW_SHOWNOACTIVE|恢复正常|显示|不变|

  • win32gui.SetForegroundWindow(hwnd)

win32ui

  • win32uiwin32gui 差别
    • win32gui 是对微软底层接口的直接封装
    • win32ui 则是对 win32gui

Device Context

  • win32ui.CreateDC():创建未初始化的设备上下文
  • win32ui.CreateDCFromHandle(handle):从句柄中创建上下文

Pywin32 接口

说明

  • pywin32 包是对 windows 提供接口的封装,和 C/CPP 接口内容相近

win32api

Shell

  • win32api.ShellExecute(hwnd, op, file, params, dir, bShow)
    • hwnd:父窗口句柄
    • op:操作,"open""print"
    • file:需要执行操作的文件
    • params:待执行操作的文件为可执行文件时,需要传递的参数
    • dir:应用执行的初始文件夹
    • bShow:应用打开时是否展示

Keyboard

  • win32api.keybd_event(bVk, bScan, dwFlags, dwExtraInfo) )
    • bVk:虚拟键码,可通过 win32con.VK_<KEY> 获取
    • bScan:硬件扫描码,一般设置为 0
    • dwFlags:一般设置为 0,表示按键按下
      • win32con.KEYEVENTF_EXTENDEDKEY
      • win32con.KEYEVENTF_KEYUP:按键释放
    • dwExtraInfo:与击键相关的附加的32位值,一般设置为 0