我有一个多线程应用程序,需要能够同时执行多次鼠标点击。
我有一个IntPtr intptr
到我需要发送鼠标点击的进程。
我试图在网上找到这些信息,我尝试过一些例子。但我没有任何工作。
据我所知,解决我的问题的正确方法是使用该功能
SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
hWnd是进程的IntPtr。
Msg是想要的操作,我想要左键单击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));
}
但正如你可能理解的那样,我无法让它发挥作用。 我的第一个问题是,坐标是在这个过程的窗口内还是 绝对屏幕坐标? 我的第二个问题是,我做错了什么?
答案 0 :(得分:3)
我最近试图在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的一小部分,这有点奇怪,但是这个类会为你处理。
答案 1 :(得分:0)
答案 2 :(得分:0)
我不明白为什么有人想要同时发送多次鼠标点击。如果要测试你的GUI,这是错误的测试。没有人可以在同一时空中多次物理点击。
但是回到你的问题,使用SendMessage对你没有帮助,因为它基本上是一个阻塞调用。即使您尝试使用PostMessage,也无法实现同时点击,因为消息队列正在从UI线程中抽取,并且会弹出消息并按顺序处理。
答案 3 :(得分:0)
我使用此代码点击了handle
中的左键public static void MouseLeftClick(Point p, int handle = 0)
{
//build coordinates
int coordinates = p.X | (p.Y << 16);
//send left button down
SendMessage(handle, 0x201, 0x1, coordinates);
//send left button up
SendMessage(handle, 0x202, 0x1, coordinates);
}
如果你没有设置调用句柄 - 那么它会发送点击到桌面,所以坐标应该是整个屏幕,如果你要设置句柄,那么消息将被发送到句柄的窗口,你应该设置窗口的坐标。
答案 4 :(得分:0)
仅使用 VirtualMouse 怎么样?我在 C# 中使用它,效果很好。
public partial class Form1 : Form
{
private VirtualMouse vm = new VirtualMouse();
public Form1()
{
InitializeComponent();
}
private void MouseClickHere(Point myPoint)
{
vm.ClickIt(myPoint, 150);
}
private void Clicker()
{
MouseClickHere(new Point(250,350));
}
}