You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在其他应用获焦时用Python模拟鼠标点击(副显示器场景)

主显示器应用聚焦时,副显示器模拟鼠标点击的解决方案

原代码的问题

  • 函数内部代码无缩进,违反Python语法规则,执行会直接报错。
  • 调用control_click时传入的"Edit1"不是合法的窗口句柄,win32gui.PostMessage需要的是通过窗口查找API获取的HWND对象,而非控件名称。
  • 依赖WM_LBUTTONDOWN/WM_LBUTTONUP消息的方式仅对传统Win32控件有效,现代应用(如Electron、DirectUI架构的程序)大多不响应这类消息,无法触发真实点击行为。

有效解决方案:模拟硬件级鼠标输入

使用Windows系统提供的输入模拟API,这种方式不受当前窗口焦点影响,能在任意显示器上触发点击。

方法一:使用mouse_event(简单兼容版)

import win32api
import win32con

def simulate_mouse_click(x, y):
    # 将鼠标移动到目标坐标(跨显示器全局坐标)
    win32api.SetCursorPos((x, y))
    # 模拟左键按下
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)
    # 模拟左键抬起
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)

# 示例:替换为你副显示器上的实际坐标
# 比如副显示器在主显示器左侧,分辨率1920x1080,可填(-1000, 500)
simulate_mouse_click(-1000, 500)

方法二:使用SendInput(官方推荐版)

mouse_event已被标记为过时,SendInput是Windows推荐的输入模拟API,兼容性更强:

import ctypes
from ctypes import wintypes

# 定义SendInput所需的结构体
INPUT_MOUSE = 0
MOUSEEVENTF_LEFTDOWN = 0x0002
MOUSEEVENTF_LEFTUP = 0x0004

class MOUSEINPUT(ctypes.Structure):
    _fields_ = [
        ("dx", wintypes.LONG),
        ("dy", wintypes.LONG),
        ("mouseData", wintypes.DWORD),
        ("dwFlags", wintypes.DWORD),
        ("time", wintypes.DWORD),
        ("dwExtraInfo", wintypes.ULONG_PTR)
    ]

class INPUT(ctypes.Structure):
    class _INPUT(ctypes.Union):
        _fields_ = [("mi", MOUSEINPUT)]
    _anonymous_ = ("_input",)
    _fields_ = [("type", wintypes.DWORD), ("_input", _INPUT)]

def simulate_mouse_click(x, y):
    # 设置鼠标位置到目标全局坐标
    ctypes.windll.user32.SetCursorPos(x, y)
    
    # 构造左键按下、抬起的输入事件
    input_down = INPUT(type=INPUT_MOUSE, mi=MOUSEINPUT(dwFlags=MOUSEEVENTF_LEFTDOWN))
    input_up = INPUT(type=INPUT_MOUSE, mi=MOUSEINPUT(dwFlags=MOUSEEVENTF_LEFTUP))
    
    # 发送输入事件
    ctypes.windll.user32.SendInput(2, ctypes.byref((INPUT * 2)(input_down, input_up)), ctypes.sizeof(INPUT))

# 调用示例:替换为副显示器的实际坐标
simulate_mouse_click(-1000, 500)

注意事项

  • 运行代码需要管理员权限,否则可能无法对部分系统级应用生效。
  • 全局坐标规则:主显示器左上角为(0,0),副显示器在左侧时X坐标为负数,在右侧时X坐标为主显示器宽度+目标X值;Y坐标统一从顶部开始计算。
  • 若不确定副显示器坐标,可通过系统显示器设置查看分辨率与布局,手动测试坐标值。

内容的提问来源于stack exchange,提问作者Marshall Jamieson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:13:16