【问题标题】:Clicking mouse by sending messages通过发送消息单击鼠标
【发布时间】:2010-05-12 11:11:16
【问题描述】:

我正在尝试将鼠标点击发送到程序。因为我不想让鼠标移动,所以我不想使用 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 坐标的愚蠢错误,如下所示,我没有检查接收点击的窗口句柄是否也是正确的客户端窗口。我现在有

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

效果很好。

【问题讨论】:

    标签: winapi windows-vista mouse


    【解决方案1】:

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

    1. y 应该在高位词中
    2. 您应该使用 | (按位或)组合坐标对的分量

    你应该有以下内容

    ((y << 0x10) | x)
    

    【讨论】:

    • @tobbez,问题是 MAKELPARAM 是一个 C 宏,OPs 代码实际上是 C#,他正在使用 Interop 调用 Win32 API。
    • 更好( y &lt;&lt; 16 ) | ( x &amp; 0xffff )
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多