我知道已经有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();
}
答案 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随附的鼠标