创建“幽灵鼠标”以模拟鼠标点击

时间:2019-07-07 14:33:24

标签: c#

我知道已经有100万个线程,但是我花了无数小时试图找到解决方案,我希望可以在这里找到它。

我的目标是创建一个“幽灵鼠标”,这意味着我希望能够在最小化窗口中模拟鼠标在特定位置的点击,而无需移动我自己的光标。我希望能够浏览Internet并单击其他内容,而该程序可以完成自己的工作。这是许多游戏机器人所具有的功能,但我的目的不是创建机器人,而只是为了体验。

到目前为止,我已经设法模拟了鼠标单击,但是使用了实际的鼠标。

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

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

public static void LeftClick()
        {
            int X = Cursor.Position.X;
            int Y = Cursor.Position.Y;

            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
        }

 static void Main(string[] args)
        {

 System.Threading.Thread.Sleep(5000);
                Point pt = new Point(1259, 560);
                Cursor.Position = pt;
                LeftClick();

}

1 个答案:

答案 0 :(得分:0)

据我所知,调用mouse_event不会在最小化的窗口中单击。
您必须为此使用SendMessage WinApi。
首先,使用OpenProcess或Process.GetProcessesByName(processName).First()。MainWindowHandle获取该进程的句柄,然后可以使用以下代码:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

public const uint WM_LBUTTONDOWN = 0x0201;
public const uint WM_LBUTTONUP = 0x0202;

public static IntPtr makeLParam(int x, int y)
{
    return (IntPtr)((y << 16) | x);
}

public static void sendMouseClick(IntPtr handle, int x, int y)
{
    SendMessage(handle, WM_LBUTTONDOWN, (IntPtr)1, makeLParam(x, y));
    SendMessage(handle, WM_LBUTTONUP, (IntPtr)1, makeLParam(x, y));
}

请注意,此代码有点旧,可能仍然无法使用。另外,请记住,游戏保护功能会阻止获取游戏过程的手柄。此外,某些游戏可能会从窗口查询鼠标的位置,而不是使用SendMessage随附的鼠标