当前位置: 首页 > 工具软件 > Pywin32 > 使用案例 >

Pywin32库的使用

阎丰羽
2023-12-01

pywin32的常用函数

  1. 获取指定窗口句柄:

    import win32gui
    
    titlename = "ceshi"
    hwnd = win32gui.FindWindow(None, titlename)
    
  2. 显示获取到的指定窗口

    win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
    win32gui.SetForegroundWindow(hwnd)
    

    show函数的参数可以为如下值:
    预定义值 等 效 值
    SW_HIDE 隐藏窗口,大小不变,激活状态不变
    SW_MAXIMIZE 最大化窗口,显示状态不变,激活状态不变
    SW_MINIMIZE 最小化窗口,显示状态不变,激活状态不变
    SW_RESTORE 从最大化或最小化恢复正常大小,显示状态不变,激活状态不变
    SW_SHOW 显示并激活窗口,大小状态不变
    SW_SHOWMAXIMIZED 显示并激活窗口,以最大化显示
    SW_SHOWMINIMIZED 显示并激活窗口,以最小化显示
    SW_SHOWMINNOACTIVE 显示窗口并最小化,激活状态不变
    SW_SHOWNA 显示窗口,大小状态不变,激活状态不变
    SW_SHOWNOACTIVATE 显示并从最大化或最小化恢复正常大小,激活状态不变
    SW_SHOWNORMAL 显示并激活窗口,恢复正常大小(初始化时用这个参数)

  3. 获取窗口位置

    pdhk = win32gui.GetWindowRect(hwnd) #left, top, right, bottom
    

    pdhk是一个数组包含 左上右下边界在屏幕中的位置;

  4. 设置鼠标位置,触发点击事件

    win32api.SetCursorPos([pdhk[0] + 53, pdhk[1] + 690])
    time.sleep(1)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0,0,0)
    time.sleep(0.1)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0,0,0)
    time.sleep(1)
    

win下一些常用的操作

import win32api
import win32gui
import win32con
import win32print
import time
 
# 1 获取句柄
# 1.1 通过坐标获取窗口句柄
handle = win32gui.WindowFromPoint(win32api.GetCursorPos())  # (259, 185)
# 1.2 获取最前窗口句柄
handle = win32gui.GetForegroundWindow()
# 1.3 通过类名或查标题找窗口
handle = win32gui.FindWindow('cls_name', "title")
# 1.4 找子窗体
sub_handle = win32gui.FindWindowEx(handle, None, 'Edit', None)  # 子窗口类名叫“Edit”
 
# 句柄操作
title = win32gui.GetWindowText(handle)
cls_name = win32gui.GetClassName(handle)
print({'类名': cls_name, '标题': title})
# 获取窗口位置
info = win32gui.GetWindowRect(handle)
# 设置为最前窗口
win32gui.SetForegroundWindow(handle)
 
# 2.按键-看键盘码
# 获取鼠标当前位置的坐标
cursor_pos = win32api.GetCursorPos()
# 将鼠标移动到坐标处
win32api.SetCursorPos((200, 200))
# 回车
win32api.keybd_event(13, 0, win32con.KEYEVENTF_EXTENDEDKEY, 0)
win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)
# 左单键击
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
# 右键单击
win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
# 鼠标左键按下-放开
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
# 鼠标右键按下-放开
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
# TAB键
win32api.keybd_event(win32con.VK_TAB, 0, 0, 0)
win32api.keybd_event(win32con.VK_TAB, 0, win32con.KEYEVENTF_KEYUP, 0)
# 快捷键Alt+F
win32api.keybd_event(18, 0, 0, 0)  # Alt
win32api.keybd_event(70, 0, 0, 0)  # F
win32api.keybd_event(70, 0, win32con.KEYEVENTF_KEYUP, 0)  # 释放按键
win32api.keybd_event(18, 0, win32con.KEYEVENTF_KEYUP, 0)
 
# 3.Message
win = win32gui.FindWindow('Notepad', None)
tid = win32gui.FindWindowEx(win, None, 'Edit', None)
# 输入文本
win32gui.SendMessage(tid, win32con.WM_SETTEXT, None, '你好hello word!')
# 确定
win32gui.SendMessage(handle, win32con.WM_COMMAND, 1, btnhld)
# 关闭窗口
win32gui.PostMessage(win32gui.FindWindow('Notepad', None), win32con.WM_CLOSE, 0, 0)
# 回车
win32gui.PostMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)  # 插入一个回车符,post 没有返回值,执行完马上返回
win32gui.PostMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
print("%x" % win)
print("%x" % tid)
# 选项框
res = win32api.MessageBox(None, "Hello Pywin32", "pywin32", win32con.MB_YESNOCANCEL)
print(res)
win32api.MessageBox(0, "Hello PYwin32", "MessageBox", win32con.MB_OK | win32con.MB_ICONWARNING)  # 加警告标志
 
# 4.截屏
from PIL import ImageGrab
# 利用PIL截屏
im = ImageGrab.grab()
im.save('aa.jpg')
 
# 5.文件的读写
import win32file, win32api, win32con
import os
 
def SimpleFileDemo():
    testName = os.path.join(win32api.GetTempPath(), "opt_win_file.txt")
 
    if os.path.exists(testName):
        os.unlink(testName)  # os.unlink() 方法用于删除文件,如果文件是一个目录则返回一个错误。
    # 写
    handle = win32file.CreateFile(testName,
                                  win32file.GENERIC_WRITE,
                                  0,
                                  None,
                                  win32con.CREATE_NEW,
                                  0,
                                  None)
    test_data = "Hello0there".encode("ascii")
    win32file.WriteFile(handle, test_data)
    handle.Close()
    # 读
    handle = win32file.CreateFile(testName, win32file.GENERIC_READ, 0, None, win32con.OPEN_EXISTING, 0, None)
    rc, data = win32file.ReadFile(handle, 1024)
    handle.Close()  # 此处也可使用win32file.CloseHandle(handle)来关闭句柄
    if data == test_data:
        print("Successfully wrote and read a file")
    else:
        raise Exception("Got different data back???")
    os.unlink(testName)
 
 
if __name__ == '__main__':
    SimpleFileDemo()
    # print(win32api.GetTempPath())  # 获取临时文件夹路径
 
# 6. ShellExecute
win32api.ShellExecute(None, "open", "C:Test.txt", None, None, SW_SHOWNORMAL)  # 打开C:Test.txt 文件
win32api.ShellExecute(None, "open", "http:#www.google.com", None, None, SW_SHOWNORMAL)  # 打开网页www.google.com
win32api.ShellExecute(None, "explore", "D:C++", None, None, SW_SHOWNORMAL)  # 打开目录D:C++
win32api.ShellExecute(None, "print", "C:Test.txt", None, None, SW_HIDE)  # 打印文件C:Test.txt
win32api.ShellExecute(None, "open", "mailto:", None, None, SW_SHOWNORMAL)  # 打开邮箱
win32api.ShellExecute(None, "open", "calc.exe", None, None, SW_SHOWNORMAL)  # 调用计算器
win32api.ShellExecute(None, "open", "NOTEPAD.EXE", None, None, SW_SHOWNORMAL)  # 调用记事本
#  ShellExecute 不支持定向输出
 
# 打印--只能打印txt word excel 不能打印图片及pdf
from win32con import SW_HIDE, SW_SHOWNORMAL
 
for fn in ['2.txt', '3.txt']:
    print(fn)
    res = win32api.ShellExecute(0,  # 指定父窗口句柄
 
                                'print',  # 指定动作, 譬如: open、print、edit、explore、find
 
                                fn,  # 指定要打开的文件或程序
 
                                win32print.GetDefaultPrinter(),
                                # 给要打开的程序指定参数;GetDefaultPrinter  取得默认打印机名称 <type 'str'>,GetDefaultPrinterW  取得默认打印机名称 <type 'unicode'>
 
                                "./downloads/",  # 目录路径
 
                                SW_SHOWNORMAL)  # 打开选项,SW_HIDE = 0; {隐藏},SW_SHOWNORMAL = 1; {用最近的大小和位置显示, 激活}
    print(res)  # 返回值大于32表示执行成功,返回值小于32表示执行错误
 
# 打印 -pdf
def print_pdf(pdf_file_name):
    """
    静默打印pdf
    :param pdf_file_name:
    :return:
    """
    # GSPRINT_PATH = resource_path + 'GSPRINTgsprint'
    GHOSTSCRIPT_PATH = resource_path + 'GHOSTSCRIPTbingswin32c' # gswin32c.exe
    currentprinter = config.printerName # "printerName":"FUJI XEROX ApeosPort-VI C3370""
    currentprinter = win32print.GetDefaultPrinter()
    arg = '-dPrinted ' 
          '-dBATCH ' 
          '-dNOPAUSE ' 
          '-dNOSAFER ' 
          '-dFitPage ' 
          '-dNORANGEPAGESIZE ' 
          '-q ' 
          '-dNumCopies=1 ' 
          '-sDEVICE=mswinpr2 ' 
          '-sOutputFile="spool' 
          + currentprinter + " " + 
          pdf_file_name
    log.info(arg)
    win32api.ShellExecute(
        0,
        'open',
        GHOSTSCRIPT_PATH,
        arg,
        ".",
        0
    )
    # os.remove(pdf_file_name)

参考文章

  1. python和pywin32实现窗口查找、遍历和点击
  2. win32gui.FindWindow Not finding window
  3. pywin32 获取窗口句柄_pywin32学习
  4. python pywin32 获取窗体edit内容_pywin32
 类似资料: