通过发送消息单击鼠标

时间:2010-05-12 11:11:17

标签: winapi windows-vista mouse

我正在尝试向程序发送鼠标点击。因为我不希望鼠标移动,我不想使用SendInput或mouse_event,因为应该接收点击的窗口并不真正使用按钮或其他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坐标的愚蠢错误,如下所示,我没有检查接收点击的Window句柄是否也是正确的客户端窗口。我现在有

        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);

完美无缺。

2 个答案:

答案 0 :(得分:4)

问题在于包装x,y坐标。

  1. y应该是高阶词
  2. 你应该使用| (按位或)组合坐标对的组件
  3. 你应该有以下

    ((y << 0x10) | x)
    

答案 1 :(得分:0)

你需要像克里斯所说的那样正确打包坐标,还要记住x和y是客户坐标,调用ScreenToClient()来转换屏幕坐标。