吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 576|回复: 33
收起左侧

[求助] 关于Python鼠标后台点击求助

[复制链接]
flyover1314 发表于 2026-2-4 17:06
本帖最后由 flyover1314 于 2026-2-6 19:39 编辑

我做了一个后台鼠标点击的python代码:
[Python] 纯文本查看 复制代码
import win32api, win32con, win32gui

hwnd = win32gui.FindWindow(None, '无标题 - 画图')
if hwnd == 0:
    print('没有找到画图窗口')

def ClickAndMove(cx, cy):
    long_position = win32api.MAKELONG(cx, cy)
    win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)
    win32api.mouse_event(win32con.MOUSEEVENTF_MOVE, 100, 100, 0, 0)
    win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position)

ClickAndMove(400, 400)




我用了win32api这个库的SendMessage方法来进行点击,IDE内显示表明已经找到了画图的窗口,然而运行后没有反应,去网上查了查,说是没有用管理员身份运行Python代码,我又尝试了以管理员身份运行,仍然无效,不知道是出了什么问题,求教各位大神
还有为什么后台点击的位置会随着物理鼠标的变化而变化,怎样固定点击坐标?

屏幕截图 2026-02-04 165720.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

picoyiyi 发表于 2026-2-4 17:20
后台点击器?
 楼主| flyover1314 发表于 2026-2-4 17:21
qq499414099 发表于 2026-2-4 17:43
试试这个样子呢?
import win32api, win32con, win32gui

# 使用类名查找(画图程序的类名是 MSPaintApp)
hwnd = win32gui.FindWindow('MSPaintApp', None)
if hwnd == 0:
    print('没有找到画图窗口')
    exit()

def ClickAndMove(cx, cy):
    # 构造坐标参数(客户区相对坐标)
    long_position = win32api.MAKELONG(cx, cy)
   
    # 1. 鼠标按下(左键)
    win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)
   
    # 2. 鼠标移动(按住左键拖动)
    new_x, new_y = cx + 100, cy + 100
    new_position = win32api.MAKELONG(new_x, new_y)
    # 移动时 wParam 表示按键状态(左键按住)
    win32api.SendMessage(hwnd, win32con.WM_MOUSEMOVE, win32con.MK_LBUTTON, new_position)
   
    # 3. 鼠标释放(左键)
    # WM_LBUTTONUP 的 wParam 为 0(表示没有按键按下)
    win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, new_position)

ClickAndMove(400, 400)
 楼主| flyover1314 发表于 2026-2-4 17:44
qq499414099 发表于 2026-2-4 17:43
试试这个样子呢?

哪个样子呢?请教一下

qq499414099 发表于 2026-2-4 17:46
flyover1314 发表于 2026-2-4 17:44
哪个样子呢?请教一下

刷新一下,点错了,代码没发上来
 楼主| flyover1314 发表于 2026-2-4 17:47
qq499414099 发表于 2026-2-4 17:46
刷新一下,点错了,代码没发上来

谢谢帮助
 楼主| flyover1314 发表于 2026-2-4 17:49
屏幕截图 2026-02-04 174831.png

谢谢您,但是还是没有反应(使用的管理员身份运行)
 楼主| flyover1314 发表于 2026-2-4 17:50
还是没有反应的
qq499414099 发表于 2026-2-4 17:58
那你试试这个,因为不知道你的系统是什么样子的,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[√] 所有操作完成")

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
outdoorreadbook + 1 + 1 用心讨论,共获提升!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-2-20 15:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表