好友
阅读权限10
听众
最后登录1970-1-1
|
那你试试这个,因为不知道你的系统是什么样子的,Win10/Win11 的画图是 UWP 应用,可能不支持这种方式:Win10/Win11 的画图是 UWP 应用,可能不支持这种方式:
import win32api
import win32con
import win32gui
import time
def find_paint_window():
# 方式1:通过类名查找
hwnd = win32gui.FindWindow('MSPaintApp', None)
if hwnd != 0:
print(f"[√] 通过类名找到画图窗口: {hwnd}")
return hwnd
# 方式2:通过窗口标题查找
hwnd = win32gui.FindWindow(None, '无标题 - 画图')
if hwnd != 0:
print(f"[√] 通过标题找到画图窗口: {hwnd}")
return hwnd
# 方式3:枚举所有窗口查找包含"画图"的窗口
def callback(hwnd, extra):
if win32gui.IsWindowVisible(hwnd):
title = win32gui.GetWindowText(hwnd)
if '画图' in title:
extra.append((hwnd, title))
return True
windows = []
win32gui.EnumWindows(callback, windows)
if windows:
print(f"[√] 找到 {len(windows)} 个画图相关窗口:")
for hwnd, title in windows:
print(f" - HWND: {hwnd}, 标题: {title}")
return windows[0][0] # 返回第一个找到的
return 0
def get_window_info(hwnd):
"""获取窗口信息"""
if hwnd == 0:
return
# 获取窗口标题
title = win32gui.GetWindowText(hwnd)
print(f"窗口标题: {title}")
# 获取窗口矩形
rect = win32gui.GetWindowRect(hwnd)
print(f"窗口位置: 左={rect[0]}, 上={rect[1]}, 右={rect[2]}, 下={rect[3]}")
print(f"窗口大小: 宽={rect[2]-rect[0]}, 高={rect[3]-rect[1]}")
# 获取客户区矩形
client_rect = win32gui.GetClientRect(hwnd)
print(f"客户区大小: 宽={client_rect[2]}, 高={client_rect[3]}")
# 获取客户区在屏幕上的位置
client_left, client_top = win32gui.ClientToScreen(hwnd, (0, 0))
print(f"客户区屏幕位置: 左={client_left}, 上={client_top}")
def click_and_drag(hwnd, start_x, start_y, end_x, end_y, delay=0.05):
"""
在指定窗口中点击并拖动
参数:
hwnd: 窗口句柄
start_x, start_y: 起始位置(客户区相对坐标)
end_x, end_y: 结束位置(客户区相对坐标)
delay: 每步延迟时间(秒)
"""
if hwnd == 0:
print("[×] 无效的窗口句柄")
return False
# 确保窗口存在
if not win32gui.IsWindow(hwnd):
print("[×] 窗口不存在")
return False
print(f"[→] 开始拖动: ({start_x}, {start_y}) -> ({end_x}, {end_y})")
# 1. 移动鼠标到起始位置(不按键)
start_pos = win32api.MAKELONG(start_x, start_y)
result = win32api.SendMessage(hwnd, win32con.WM_MOUSEMOVE, 0, start_pos)
time.sleep(delay)
# 2. 按下左键
start_pos = win32api.MAKELONG(start_x, start_y)
result = win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, start_pos)
print(f" 按下左键: 返回={result}")
time.sleep(delay)
# 3. 拖动到结束位置,多步模拟真实拖动
steps = 10
for i in range(1, steps + 1):
t = i / steps
cur_x = int(start_x + (end_x - start_x) * t)
cur_y = int(start_y + (end_y - start_y) * t)
cur_pos = win32api.MAKELONG(cur_x, cur_y)
win32api.SendMessage(hwnd, win32con.WM_MOUSEMOVE, win32con.MK_LBUTTON, cur_pos)
time.sleep(delay / 2)
# 4. 释放左键
end_pos = win32api.MAKELONG(end_x, end_y)
result = win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, end_pos)
print(f" 释放左键: 返回={result}")
print("[√] 拖动完成")
return True
def click(hwnd, x, y):
"""在指定位置点击"""
if hwnd == 0:
print("[×] 无效的窗口句柄")
return False
pos = win32api.MAKELONG(x, y)
# 按下
win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, pos)
time.sleep(0.05)
# 释放
win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, pos)
print(f"[√] 点击 ({x}, {y})")
return True
print("=" * 50)
print("画图后台操作工具")
print("=" * 50)
# 1. 查找窗口
hwnd = find_paint_window()
if hwnd == 0:
print("[×] 未找到画图窗口,请确保画图程序已运行")
exit()
# 2. 显示窗口信息
print("\n--- 窗口信息 ---")
get_window_info(hwnd)
# 3. 执行操作
print("\n--- 执行操作 ---")
# 1:画一条线(从左上到右下)
# click_and_drag(hwnd, 100, 100, 300, 300)
# 2:画一个矩形(四条边)
def draw_rect(hwnd, x, y, w, h):
"""画矩形"""
click_and_drag(hwnd, x, y, x + w, y) # 上边
click_and_drag(hwnd, x + w, y, x + w, y + h) # 右边
click_and_drag(hwnd, x + w, y + h, x, y + h) # 下边
click_and_drag(hwnd, x, y + h, x, y) # 左边
# 在画布中心画一个矩形
draw_rect(hwnd, 200, 200, 200, 150)
print("\n[√] 所有操作完成") |
免费评分
-
查看全部评分
|