python 常用win32api 后台截图 后台鼠标 后台键盘 后台输入文字 剪切板

  1. 依赖包
import win32gui, win32con, win32api,win32ui
from win32clipboard import *
import cv2
  1. 获得焦点
    win32api.SendMessage(hwnd, win32con.WM_SETFOCUS, 0, 0)
  1. 后台鼠标
def click_point(x, y, hwnd=None):
    get_focus()
    win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, 0, ((y) << 16 | (x)));
    win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, ((y) << 16 | (x)));
  1. 后台按键
def send_enter(hwnd=None):
       win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, 13, 0)
       win32api.SendMessage(hwnd, win32con.WM_KEYUP, 13, 0)
  1. 后台输入
def send_str(text, hwnd=None):
    astrToint = [ord(c) for c in text]
    for item in astrToint:
        win32api.PostMessage(hwnd, win32con.WM_CHAR, item, 0)
  1. 设置剪切板
def set_cli_text(text):
        OpenClipboard()
        SetClipboardData(win32con.CF_UNICODETEXT , text)
        CloseClipboard()
  1. 粘贴
def wm_paste(hwnd):
    win32api.SendMessage(hwnd, win32con.WM_CLEAR , 0, 0)
    win32api.SendMessage(hwnd, win32con.WM_PASTE, 0, 0)
  1. 修改combobox下拉框的值 & edit写入数据9
    # win32gui.SendMessage(464950, win32con.CB_SHOWDROPDOWN, 1, 0)  # //展开ComboBox列表框
    # win32gui.SendMessage(464950, win32con.CB_SETCURSEL, 3, 0)  # 指向需要写入的下标
    # win32gui.SendMessage(464950, win32con.CB_SHOWDROPDOWN, 0, 0)  # //关闭ComboBox列表框
    # win32gui.SendMessage(597358, win32con.WM_SETTEXT, 0, "123123")  # edit写入数据
  1. 后台截图

import numpy as np
from PIL import Image
from functools import reduce
def window_capture(
    hwnd,
    scaling_factor=1.25,
    point_rct=None,
):
    # hwnd 句柄
    # scaling_factor 缩放比例
    # point_rct 截取的区域,(x,y,w,h)

    hwndDC = win32gui.GetWindowDC(hwnd)
    mfcDC = win32ui.CreateDCFromHandle(hwndDC)
    saveDC = mfcDC.CreateCompatibleDC()
    saveBitMap = win32ui.CreateBitmap()
    rctA = win32gui.GetWindowRect(hwnd)

    w = rctA[2] - rctA[0]
    h = rctA[3] - rctA[1]

    w = int(w * scaling_factor)
    h = int(h * scaling_factor)

    saveBitMap.CreateCompatibleBitmap(mfcDC, point_rct[2], point_rct[3])
    saveDC.SelectObject(saveBitMap)
    saveDC.BitBlt(
        (0, 0),
        (point_rct[2], point_rct[3]),
        mfcDC,
        (point_rct[0], point_rct[1]),
        win32con.SRCCOPY,
    )
    signedIntsArray = saveBitMap.GetBitmapBits(True)
    img = np.frombuffer(signedIntsArray, dtype="uint8")
    img.shape = (point_rct[3], point_rct[2], 4)
    win32gui.DeleteObject(saveBitMap.GetHandle())
    mfcDC.DeleteDC()
    saveDC.DeleteDC()
    return cv2.cvtColor(img, cv2.COLOR_RGBA2RGB)

def phash(img):
    img = img.resize((8, 8), Image.ANTIALIAS).convert("L")
    avg = reduce(lambda x, y: x + y, img.getdata()) / 64.0
    return reduce(
        lambda x, y: x | (y[1] << y[0]),
        enumerate(map(lambda i: 0 if i < avg else 1, img.getdata())),
        0,
    )

# 计算汉明距离
def hamming_distance(a, b):
    return bin(a ^ b).count("1")

# 计算图片相似度
def is_imgs_similar(img1, img2):
    dif = hamming_distance(phash(img1), phash(img2))
    print(dif)
    if dif <= 5:
        return True
    else:
        return False


hwnd = 197632 #句柄
point_rct = (2194, 210, 135, 21) # xywh
mat = window_capture(hwnd, 1.25, point_rct)
pil_image = Image.fromarray(mat)
#切割图片
x_image = pil_image.crop((0, 0, 67, 21))
y_image = pil_image.crop((67, 0, 133, 20))
#判断相似性
is_sim = is_imgs_similar(x_image, y_image)
print(is_sim)

print(x, y)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值