c#鼠标单击模拟到x / y位置的hwnd

时间:2014-09-27 11:38:50

标签: c# winapi mouse

在过去的3天里,我发现了大量用于模拟鼠标点击其他窗口的代码。但他们都没有奏效。 我有窗口句柄hwnd和点击必须的X / Y位置(像素)。 X / Y位置是窗口内的位置。

我发现的最佳代码是:

public void click(IntPtr hWnd, int x, int y)
{        
    RECT rec = new RECT();
    GetWindowRect(hWnd, ref rec);
    int newx = x - rec.Left;
    int newy = y - rec.Top;

    SendMessage(hWnd, WM_LBUTTONDOWN, 1, ((newy << 0x10) | newx));
    SendMessage(hWnd, WM_LBUTTONUP, 0, ((newy << 0x10) | newx));
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

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


[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

但它不能100%正确地工作。 它模拟鼠标点击正确的窗口,但是在我的真实光标的位置。 然后点击鼠标,鼠标跳到屏幕上的随机位置。 我希望有人有一个工作代码和一个小描述它是如何工作的。

由于

1 个答案:

答案 0 :(得分:1)

使用此代码模拟鼠标在特定位置的单击

//This is a replacement for Cursor.Position in WinForms
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern bool SetCursorPos(int x, int y);

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

public const int MOUSEEVENTF_LEFTDOWN = 0x02;
public const int MOUSEEVENTF_LEFTUP = 0x04;

//This simulates a left mouse click
public static void LeftMouseClick(int xpos, int ypos)
{
    SetCursorPos(xpos, ypos);
    mouse_event(MOUSEEVENTF_LEFTDOWN, xpos, ypos, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, xpos, ypos, 0, 0);
}