python - 模拟鼠标按下窗口(有效,但位置不起作用)
问题描述
我正在用python编写代码来模拟鼠标按下窗口。我目前的代码是:
def MousePress_Pos(x, y):
pos = MAKELONG(x, y)
SendMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, pos)
SendMessage(hwnd, WM_LBUTTONUP, MK_LBUTTON, pos)
这段代码成功地模拟了鼠标按下,但它没有在给定的 X 和 Y 上执行此操作。相反,它按下了我鼠标的当前 X 和 Y!
当窗口没有聚焦时也会发生这种情况。它只是忽略给定的 X 和 Y 并用鼠标的 X 和 Y 按下窗口。
我不知道为什么会这样。有人知道我该怎么做吗?谢谢。
解决方案
使用SendInput
而不是SendMessage
模拟鼠标输入。
以下是 C++ 中的示例,您可以参考:
int sx = GetSystemMetrics(SM_CXSCREEN);
int sy = GetSystemMetrics(SM_CYSCREEN);
long x_calc = x * 65536 / sx;
long y_calc = y * 65536 / sy;
INPUT mi = { 0 };
mi.type = INPUT_MOUSE;
mi.mi.dx = x_calc;
mi.mi.dy = y_calc;
mi.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN;
SendInput(1, &mi, sizeof(mi));
mi.mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(1, &mi, sizeof(mi));
如何在 Python 中实现相同的工作,请参考以下两个线程。
第一个:
import math
#...
x_calc = math.floor(65536 * x_pos / ctypes.windll.user32.GetSystemMetrics(self.SM_CXSCREEN) + 1)
y_calc = math.floor(65536 * y_pos / ctypes.windll.user32.GetSystemMetrics(self.SM_CYSCREEN) + 1)
第二个:
class MOUSEINPUT(ctypes.Structure):
_fields_ = (("dx", wintypes.LONG),
("dy", wintypes.LONG),
("mouseData", wintypes.DWORD),
("dwFlags", wintypes.DWORD),
("time", wintypes.DWORD),
("dwExtraInfo", wintypes.ULONG_PTR))
推荐阅读
- php - 教义 3 合并替代方案
- excel - VBA Excel Msgbox If 语句用于操作
- kubernetes - 仅在使用 Ansible 运行时,kubectl 和 helm 命令上的“无法连接到服务器:禁止”
- javascript - 用于 eventemitter 对象的 jest 测试发射事件 (http)
- node.js - 在路径“作者”处,值“5e54c953031de84cd86b22a0”转换为 ObjectID 失败
- c# - OracleParameterCollection 给了我奇怪的错误
- azure - 使用 AzureCLI 任务删除容器
- r - R中的geofacet包为geofacets中的条形图添加标签
- python - 更改 Pandas 默认的 NA 类型促销
- sql - 将 2 个查询放在一起