【问题标题】:Simulating a mouse press to a window(Works, but the position isn't working)模拟鼠标按下窗口(有效,但位置不起作用)
【发布时间】:2020-06-29 22:07:22
【问题描述】:

我正在用 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 按下窗口。

我不知道为什么会这样。有人知道我该怎么做吗?谢谢。

【问题讨论】:

标签: python winapi


【解决方案1】:

使用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 中实现相同的工作,请参考以下两个线程。

First one:

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)

Second one:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2010-09-19
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多