pywin32 使用记录-长期维护

683 阅读3分钟

记录一下用到的pywin32代码块,免得每次需要用到的时候到处翻找

一、窗口相关操作

1、获取窗口句柄

windows 上想要对指定窗口进行操作一定要先获取窗口句柄, 这是大前提

import win32gui

# 根据窗口名获取窗口句柄
def get_hwnd(windowFullName='', windowSymbolName=''):
    """
    :param windowFullName: 完整匹配窗口名
    :param windowSymbolName:    关键字包含匹配窗口名
    :return:
    """

    hwndList = []
    # 遍历窗口获取所有的窗口的句柄
    win32gui.EnumWindows(lambda hwnd, param: param.append(hwnd), hwndList)
    for hwnd in hwndList:
        # 通过句柄获取窗口标题
        windowName = win32gui.GetWindowText(hwnd)

        if windowFullName != '' and windowFullName == windowName:
            return hwnd

        if windowSymbolName != '' and windowSymbolName in windowName:
            return hwnd

    return None

2、根据窗口句柄获取窗口位置

也可以根据窗口位置推算出窗口大小

left_top_x, left_left_top_y, right_bottom_x, right_bottom_y = win32gui.GetWindowRect(hwnd)

3、设置窗口位置

点击查看: 官方说明

import win32gui
import win32con

win32gui.SetWindowPos(hwnd, hWndInsertAfter, x, y, cx, cy, flag)

参数解析:

hwnd: 窗口句柄

hWndInsertAfter: 用于在 Z 顺序中定位的窗口之前

含义
win32con.HWND_BOTTOM将窗口置于Z序的底部
win32con.HWND_DOTTOPMOST将窗口置于所有最顶层窗口的后面
win32con.HWND_TOP将窗口置于Z序的顶部
win32con.HWND_TOPMOST将窗口置于所有非顶层窗口之上

x: 新位置的左上角x坐标

y: 新位置左上角y坐标

cx: 窗口宽

cy :窗口高

flag : 窗口大小调整和定位标志, 这里可以进行组合, 组合写法 a|b

标题
win32con.SWP_ASNCWINDOWPOS如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求
win32con.SWP_DEFERERASE防止产生WM_SYNCPAINT消息
win32con.SWP_DRAWFRAME在窗口周围画一个边框
win32con.SWP_FRAMECHANGED给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息
win32con.SWP_HIDEWINDOW隐藏窗口
win32con.SWP_NOACTIVATE不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部
win32con.SWP_NOCOPYBITS清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区
win32con.SWP_NOMOVE维持当前位置(忽略X和Y参数)
win32con.SWP_NOOWNERZORDER不改变z序中的所有者窗口的位置
win32con.SWP_NOREDRAW不重画改变的内容。如果设置了这个标志,则不发生任何重画动作
win32con.SWP_NOREPOSITION适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父窗口的所有部分
win32con.SWP_NOSENDCHANGING防止窗口接收WM_WINDOWPOSCHANGING消息
win32con.SWP_NOSIZE维持当前尺寸(忽略cx和Cy参数)
win32con.SWP_NOZORDER维持当前Z序(忽略hWndlnsertAfter参数)
win32con.SWP_SHOWWINDOW显示窗口

4、激活窗口

import win32gui

win32gui.ShowWindow(hwnd, 1)
win32gui.SetForegroundWindow(hwnd)

二、显示器相关

1、获取显示器尺寸

import win32api
import win32con

width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN)

三、输入相关

键盘输入的虚拟按键码查询

1、按键

1)后台按键

这里要特别注意:

1、部分后台应用有接受后台消息限制, 对于组合按键可能并不友好

2、部分应用使用虚拟按键码不生效,比如:ps5的远程工具,这种情况下推荐用 keyboard.press 来完成,是另外一个三方库,暂时还没研究两种不通用的按键库有何区别

import win32con
import win32api

win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, 0x41, 0)  # 发送消息:按下a
win32api.PostMessage(hwnd, win32con.WM_KEYUP, 0x41, -1)  # 发送消息:弹起a

2)前台按键

import win32api
import win32con

win32api.keybd_event(0x41, 0, 0, 0)  # 按下A
win32api.keybd_event(0x41, 0, win32con.KEYEVENTF_KEYUP, 0)  # 谈起A

3)获取按键状态

import win32api

state = win32api.GetKeyState(0x14)  # 获取大小写状态:1:开启大写  0:开启小写

2、鼠标

1)获取鼠标当前位置

import win32api

mouse_x, mouse_y = win32api.GetCursorPos()

四、转换

1、鼠标屏幕位置转hwnd客户端内位置

import win32gui

client_rect = win32gui.ScreenToClient(hwnd, (mouse_x, mouse_y))