虚拟鼠标点击c#
我有一个多线程应用程序,需要能够同时执行多次鼠标点击。
我有一个IntPtr intptr
到我需要发送鼠标点击的进程。 我试图在网上找到这些信息,并且我已经尝试了一些例子。 但我没有得到任何工作。
据我了解,解决我的问题的正确方法是使用函数SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
hWnd是进程的IntPtr。 消息是想要的动作,我想要左键单击, int WM_LBUTTONDBLCLK = 0x0203;
IntPtr wParam对这个问题没有意义(据我所知)并且点击的坐标是在lParam中。 我构建了lParam,
Int32 word = MakeLParam(x, y);
private int MakeLParam(int LoWord, int HiWord)
{
return ((HiWord << 16) | (LoWord & 0xffff));
}
但是,正如你可能明白的,我无法得到这个工作。 我的第一个问题是,坐标是在这个过程的窗口内,还是绝对的屏幕坐标? 而我的第二个问题,我做错了什么?
我刚刚在C#中试图模拟鼠标点击,我写了这个小助手类来做诀窍:
public static class SimInput
{
[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo);
[Flags]
public enum MouseEventFlags : uint
{
Move = 0x0001,
LeftDown = 0x0002,
LeftUp = 0x0004,
RightDown = 0x0008,
RightUp = 0x0010,
MiddleDown = 0x0020,
MiddleUp = 0x0040,
Absolute = 0x8000
}
public static void MouseEvent(MouseEventFlags e, uint x, uint y)
{
mouse_event((uint)e, x, y, 0, UIntPtr.Zero);
}
public static void LeftClick(Point p)
{
LeftClick((double)p.X, (double)p.Y);
}
public static void LeftClick(double x, double y)
{
var scr = Screen.PrimaryScreen.Bounds;
MouseEvent(MouseEventFlags.LeftDown | MouseEventFlags.LeftUp | MouseEventFlags.Move | MouseEventFlags.Absolute,
(uint)Math.Round(x / scr.Width * 65535),
(uint)Math.Round(y / scr.Height * 65535));
}
public static void LeftClick(int x, int y)
{
LeftClick((double)x, (double)y);
}
}
坐标是65535的一小部分,这有点奇怪,但这个班会为你处理。
我不是100%肯定我明白你想要完成的。 但如果你想模拟鼠标输入,那么我建议使用SendInput API。
您可以提供一组要插入输入流的输入。
另请参阅:PInvoke参考
我不明白为什么有人想同时发送多个鼠标点击。 如果是测试你的GUI,那是错误的测试。 没有人可以在同一时间空间中多次点击物体。
但回到你的问题,使用SendMessage不会帮助你,因为它基本上是一个阻塞呼叫。 即使您尝试使用PostMessage,您也无法完成同时点击,因为消息队列正在从UI线程中获取并弹出消息并按顺序处理。
链接地址: http://www.djcxy.com/p/63601.html