当前位置:   article > 正文

Pywin32学习_pywin32教程

pywin32教程

win32gui

1 通过坐标点找窗口句柄
import win32gui
hid = win32gui.WindowFromPoint((100, 100))
  • 1
  • 2
2 通过句柄获取窗口标题或类名
title = win32gui.GetWindowText(hid)
class_name = win32gui.GetClassName(hid)
  • 1
  • 2
3 通过标题找到窗口的句柄

方法1:通过标题查找,仅返回一个顶层窗口的句柄,不支持模糊查询

# 参数:类名,窗口标题,未找到返回0
hid = win32gui.FindWindow(None, "照片")
  • 1
  • 2

方法2:遍历查找到所有可能符合标题的句柄,支持模糊查找

import win32gui


def find_hid_by_title(title):
    hid_title_dict = {}

    def get_all_hid_title(hid, arg):
        # IsWindow:如果窗口句柄标识了一个已存在的窗口,返回值为非零;如果窗口句柄未标识一个已存在窗口,返回值为零
        # IsWindowEnabled:若窗口允许接受键盘或鼠标输入,则返回非0值,若窗口不允许接受键盘或鼠标输入,则返回值为0。
        # IsWindowVisible:该函数获得给定窗口的可视状态
        if win32gui.IsWindow(hid) and win32gui.IsWindowEnabled(hid) and win32gui.IsWindowVisible(hid):
            hid_title_dict[hid] = win32gui.GetWindowText(hid)

    # 枚举屏幕上所有顶层窗口,参数:回调函数,传递给回调函数的第二个参数
    win32gui.EnumWindows(get_all_hid_title, 0)

    # 找到含title的窗口
    match_res = {}
    for k, v in hid_title_dict.items():
        if str(title) in v:
            match_res[k] = v
    return match_res


if __name__ == "__main__":
    res = find_hid_by_title("照片")
    if len(res) == 0:
        print("未找到句柄")
    else:
        for hid, title in res.items():
            print(f"hid: {hid}, title: {title}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
4 通过句柄获取窗口位置和大小
# 获取相对屏幕左上角的位置,得到窗口左上角和右下角坐标
left, top, right, bottom = win32gui.GetWindowRect(hid)
  • 1
  • 2
5 通过句柄设置窗口位置和大小
hid = 1509318
# 参数:句柄,窗口左边界,窗口上边界,窗口宽度,窗口高度,确定窗口是否被刷新
win32gui.MoveWindow(hid, 100, 100, 800, 800, True)
  • 1
  • 2
  • 3
6 通过父句柄获取字句柄信息

方法一:枚举

import win32gui


def child_handler(cid, child_info_list):
    rect = win32gui.GetWindowRect(cid)
    class_name = win32gui.GetClassName(cid)
    child_info_list.append([cid, class_name, rect])


def get_child_info(hid):
    child_info_list = []
    win32gui.EnumChildWindows(hid, child_handler, child_info_list)
    return child_info_list


if __name__ == "__main__":
    hid = 1509318
    print(get_child_info(hid))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

方法二:递归查询

import win32gui


def find_all_child_hid(hid):
    res = []

    def find_child_hid(hid, res, child_hid=None, class_name=None, title=None):
        # 参数:父窗口句柄,子窗口句柄,子类名,子类标题
        c_id = win32gui.FindWindowEx(hid, child_hid, class_name, title)
        if c_id != 0:
            res.append(c_id)
            find_child_hid(hid, res, child_hid=c_id)

    find_child_hid(hid, res)
    return res


def get_all_child_info(hid):
    cid_list = find_all_child_hid(hid)
    res = []
    for item in cid_list:
        rect = win32gui.GetWindowRect(item)
        class_name = win32gui.GetClassName(item)
        res.append([item, class_name, rect])
    return res


if __name__ == "__main__":
    hid = 1509318
    print(get_all_child_info(hid))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
7 激活句柄窗口
hid = 2556718
# 将创建指定窗口的线程设置到前台,并且激活该窗口
win32gui.SetForegroundWindow(hid)

  • 1
  • 2
  • 3
  • 4

二 win32api

1 获取或设置鼠标位置
import win32api

# 设置位置
win32api.SetCursorPos((100, 100))
# 获取位置
point = win32api.GetCursorPos()
print(point)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
2 模拟鼠标点击

参数

win32api.mouse_event(flags, x, y, data, extra_info)
"""
flags:
    MOUSEEVENTF_LEFTDOWN:表明接按下鼠标左键。
    MOUSEEVENTF_LEFTUP:表明松开鼠标左键。
    MOUSEEVENTF_RIGHTDOWN:表明按下鼠标右键。
    MOUSEEVENTF_RIGHTUP:表明松开鼠标右键。
    MOUSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。
    MOUSEEVENTF_MIDDLEUP:表明松开鼠标中键。
    MOUSEEVENTF_WHEEL:鼠标轮移动,数量由data给出。
"""

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

左击

import win32api, win32con


def left_click(point):
    win32api.SetCursorPos(point)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)


if __name__ == "__main__":
    point = (734, 737)
    left_click(point)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

三 鼠标点击获取句柄和相对位置

pynput绑定鼠标事件

import win32gui
from pynput import mouse
from multiprocessing import Process


class GetHid:
    def __init__(self):
        self.res = {}

    def get_some(self, x, y, button, press):
        hid = win32gui.WindowFromPoint((x, y))
        title = win32gui.GetWindowText(hid)
        class_name = win32gui.GetClassName(hid)
        rect = win32gui.GetWindowRect(hid)
        self.res.update({
            "hid": hid,
            "relx": x - rect[0],
            "rely": y - rect[1],
            "rect": rect,
            "class_name": class_name,
            "title": title,
        })
        print(self.res)

    def _get_hid(self):
        while True:
            with mouse.Listener(on_click=self.get_some) as lis:
                lis.join()

    def main(self):
        self._get_hid()


if __name__ == "__main__":
    p1 = Process(target=GetHid().main)
    p1.start()
    p1.join()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

四 通过句柄和坐标模拟后台点击

import win32api
import win32con
import win32gui


def left_click(rx, ry, hwnd):
    # 模拟鼠标指针 传送到窗口相对坐标
    long_position = win32api.MAKELONG(rx, ry)
    # 模拟鼠标左击
    win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)
    win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position)


if __name__ == "__main__":
    # 找到句柄和相对点击位置
    hwnd = 66518
    cx = 238
    cy = 23
    left_click(cx, cy, hwnd)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/109230
推荐阅读
  

闽ICP备14008679号