gpt4 book ai didi

winapi - 通过发送消息点击鼠标

转载 作者:行者123 更新时间:2023-12-04 15:27:47 32 4
gpt4 key购买 nike

我正在尝试将鼠标点击发送到程序。因为我不想让鼠标移动,所以我不想使用 SendInput 或 mouse_event,并且因为应该接收点击的窗口并没有真正使用 Buttons 或其他 GUI 事件,所以我无法向这些发送消息纽扣。

我正在尝试使用 SendMessage 使其正常工作,但由于某种原因它不起作用。相关代码是(在 C# 中,但也用 jnative 尝试过 Java),在 Vista 上尝试这个

    [DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int SendMessage(IntPtr A_0, int A_1, int A_2, int A_3);

static int WM_CLOSE = 0x10;
static int WM_LBUTTONDOWN = 0x201;
static int WM_LBUTTONUP = 0x202;

public static void click(IntPtr hWnd, int x, int y)
{
SendMessage(hWnd, WM_LBUTTONDOWN, 1, ((x << 0x10) ^ y));
SendMessage(hWnd, WM_LBUTTONUP, 0, ((x << 0x10) ^ y));
}

public static void close(IntPtr hWnd)
{
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
close工作正常,但 click什么都不做。

编辑:发现问题。除了替换 x 和 y 坐标的愚蠢错误,如下所示,我没有检查接收点击的窗口句柄是否也是正确的客户端窗口。我现在有
        POINT p = new POINT(x, y);
IntPtr hWnd = WindowFromPoint(p);

RECT rct = new RECT();

if (!GetWindowRect(hWnd, ref rct))
{
return;
}

int newx = x - rct.Left;
int newy = y - rct.Top;
SendMessage(hWnd, WM_LBUTTONDOWN, 1, newy * 65536 + newx);
SendMessage(hWnd, WM_LBUTTONUP, 0, newy * 65536 + newx);

这工作完美。

最佳答案

问题在于您对 x,y 坐标的打包。

  • y应该在高位词
  • 你应该使用 | (按位或)组合坐标对的分量

  • 你应该有以下
    ((y << 0x10) | x)

    关于winapi - 通过发送消息点击鼠标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2818192/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com