C# 虚拟鼠标点击#

C# 虚拟鼠标点击#,c#,C#,我有一个多线程的应用程序,需要能够执行多个鼠标点击在同一时间 我有一个IntPtr IntPtr到一个进程,我需要在该进程上发送鼠标单击。 我试图在网上找到这些信息,我也尝试过一些例子。但是我没有任何一个可以工作 据我所知,解决我的问题的正确方法是使用函数 SendMessage(IntPtr hWnd、int Msg、IntPtr wParam、IntPtr lParam) hWnd是进程的IntPtr。 Msg是想要的操作,我想要左键单击,int WM_lbuttondblck=0x0203

我有一个多线程的应用程序,需要能够执行多个鼠标点击在同一时间

我有一个
IntPtr IntPtr
到一个进程,我需要在该进程上发送鼠标单击。 我试图在网上找到这些信息,我也尝试过一些例子。但是我没有任何一个可以工作

据我所知,解决我的问题的正确方法是使用函数
SendMessage(IntPtr hWnd、int Msg、IntPtr wParam、IntPtr lParam)

hWnd是进程的IntPtr。 Msg是想要的操作,我想要左键单击,
int WM_lbuttondblck=0x0203
IntPtr wParam对这个问题没有任何影响(据我所知)
点击的坐标在lParam中。
我像这样构造LPRAM

Int32 word = MakeLParam(x, y);

private int MakeLParam(int LoWord, int HiWord)
     {
         return ((HiWord << 16) | (LoWord & 0xffff));
     }
Int32 word=MakeLParam(x,y);
私有int-MakeLParam(int-LoWord,int-HiWord)
{

return((HiWord我不能100%确定我是否理解您试图实现的目标。但是如果您想要模拟鼠标输入,那么我建议使用API

您可以提供要插入到输入流中的输入数组


另请参见:

我不明白为什么有人希望同时发送多个鼠标单击。如果是为了测试您的GUI,那么这是错误的测试。没有人可以在同一时间段内多次实际单击某个对象


但回到您的问题,使用SendMessage对您没有帮助,因为它基本上是一个阻塞调用。即使您尝试使用PostMessage,您也无法同时完成单击,因为消息队列正在从UI线程中抽取,并且消息会按顺序弹出和处理。

我将此代码用于cli按下左键

public static void MouseLeftClick(点p,int handle=0)
{
//构建坐标

int coordinates=p.X |(p.Y我最近试图在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的一小部分,这有点奇怪,但是这个类将为您处理这个问题。

使用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));
        }
    }

这里有更多信息:这听起来像是一个问题,有一个比你开始时更好的解决方案…你为什么要这样做?好的。我觉得我必须澄清一下。我想要的不是在同一个IntPtr IntPtr上多次单击鼠标。我想要的是在不同的IntPtr IntPtr上有多个单击事件。使用我的第一次尝试是移动鼠标指针并执行一次单击。当只有一个进程执行此操作时,此操作非常有效。当多个线程尝试单击不同的位置时,它会失败。如果“最近”执行此操作,你为什么用过时的而不是推荐的?@CodyGray:我无法让SendInput工作。这个OTOH工作得很好。如果你有一个C#示例,使用SendInput以像素为单位发送屏幕坐标中的鼠标点击……我想看看。
    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));
        }
    }