Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击指定的客户端区域_C#_Click_Client_Mouse_Sendmessage - Fatal编程技术网

C# 单击指定的客户端区域

C# 单击指定的客户端区域,c#,click,client,mouse,sendmessage,C#,Click,Client,Mouse,Sendmessage,单击无效-我不知道原因,也找不到解决方案:( 例如,Click(150215)应将鼠标移动到客户端区域并在那里单击 [DllImport("user32.dll")] private static extern bool ScreenToClient(IntPtr hWnd, ref Point lpPoint); [DllImport("user32", SetLastError = true)] private static extern int SetCu

单击
无效-我不知道原因,也找不到解决方案:(

例如,
Click(150215)
应将鼠标移动到客户端区域并在那里单击

    [DllImport("user32.dll")]
    private static extern bool ScreenToClient(IntPtr hWnd, ref Point lpPoint);

    [DllImport("user32", SetLastError = true)]
    private static extern int SetCursorPos(int x, int y);

    static void MouseMove(int x, int y)
    {
        Point p = new Point(x * -1, y * -1);
        ScreenToClient(hWnd, ref p);
        p = new Point(p.X * -1, p.Y * -1);
        SetCursorPos(p.X, p.Y);
    }

    static void Click(int x, int y)
    {
        MouseMove(x, y);
        SendMessage(hWnd, WM_LBUTTONDOWN, (IntPtr)0x1, new IntPtr(y * 0x10000 + x));
        SendMessage(hWnd, WM_LBUTTONUP, (IntPtr)0x1, new IntPtr(y * 0x10000 + x));
    }
编辑: 以下方法可行,但我认为“更先进”。

当然,我可以使用
mouse\u event
,但我希望看到SendMessage()的解决方案

过了一会儿,我发现另一个方法是通过
SendInput
使用
MouseInput
,但它很长:p

它能缩小吗

        [Flags]
    enum MouseEventFlags : uint
    {
        MOUSEEVENTF_MOVE = 0x0001,
        MOUSEEVENTF_LEFTDOWN = 0x0002,
        MOUSEEVENTF_LEFTUP = 0x0004,
        MOUSEEVENTF_RIGHTDOWN = 0x0008,
        MOUSEEVENTF_RIGHTUP = 0x0010,
        MOUSEEVENTF_MIDDLEDOWN = 0x0020,
        MOUSEEVENTF_MIDDLEUP = 0x0040,
        MOUSEEVENTF_XDOWN = 0x0080,
        MOUSEEVENTF_XUP = 0x0100,
        MOUSEEVENTF_WHEEL = 0x0800,
        MOUSEEVENTF_VIRTUALDESK = 0x4000,
        MOUSEEVENTF_ABSOLUTE = 0x8000
    }

    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

    [StructLayout(LayoutKind.Explicit)]
    struct MouseKeybdhardwareInputUnion
    {
        [FieldOffset(0)]
        public MouseInputData mi;
    }
    struct MouseInputData
    {
        public int dx;
        public int dy;
        public uint mouseData;
        public MouseEventFlags dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct INPUT
    {
        public SendInputEventType type;
        public MouseKeybdhardwareInputUnion mkhi;
    }
    enum SendInputEventType : int
    {
        InputMouse,
    }

    static void Click(int x, int y)
    {
        INPUT mouseInput = new INPUT();
        mouseInput.type = SendInputEventType.InputMouse;
        mouseInput.mkhi.mi.dx = x;
        mouseInput.mkhi.mi.dy = y;
        mouseInput.mkhi.mi.mouseData = 0;

        MouseMove(x, y);
        mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
        SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));

        mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP;
        SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));
    }

虽然我还没有调查您描述的确切问题,但我建议您了解一下哪些是Windows API调用,旨在实现您描述的功能

mouse\u event
是较旧版本的调用,
SendInput
较新,通过支持多个输入事件取代了
mouse\u input
。这两种方法都可以在p/Invoke.net上的以下URL中找到:

  • 鼠标事件
  • SendInput

谢谢,我已经有了鼠标事件方法。你认为
SendInput
比简单的
SendMessage
更好(性能、速度)吗?请查看我的编辑,告诉我它是否可以缩小:)将
WM\u LBUTTONDOWN
发送到任何你不拥有的窗口似乎很容易出错。我找不到任何实际的文档建议以这种方式使用
WM_LBUTTONDOWN
,我知道
mouse_event
SendInput
是受支持的方式。如果您担心这样一个调用的性能,那么必须对其进行基准测试。虽然
SendInput
很冗长,但大部分都是P/Invoke签名。好吧,无论如何,我找到了另外两种方法来解决这个问题:)
        [Flags]
    enum MouseEventFlags : uint
    {
        MOUSEEVENTF_MOVE = 0x0001,
        MOUSEEVENTF_LEFTDOWN = 0x0002,
        MOUSEEVENTF_LEFTUP = 0x0004,
        MOUSEEVENTF_RIGHTDOWN = 0x0008,
        MOUSEEVENTF_RIGHTUP = 0x0010,
        MOUSEEVENTF_MIDDLEDOWN = 0x0020,
        MOUSEEVENTF_MIDDLEUP = 0x0040,
        MOUSEEVENTF_XDOWN = 0x0080,
        MOUSEEVENTF_XUP = 0x0100,
        MOUSEEVENTF_WHEEL = 0x0800,
        MOUSEEVENTF_VIRTUALDESK = 0x4000,
        MOUSEEVENTF_ABSOLUTE = 0x8000
    }

    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

    [StructLayout(LayoutKind.Explicit)]
    struct MouseKeybdhardwareInputUnion
    {
        [FieldOffset(0)]
        public MouseInputData mi;
    }
    struct MouseInputData
    {
        public int dx;
        public int dy;
        public uint mouseData;
        public MouseEventFlags dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct INPUT
    {
        public SendInputEventType type;
        public MouseKeybdhardwareInputUnion mkhi;
    }
    enum SendInputEventType : int
    {
        InputMouse,
    }

    static void Click(int x, int y)
    {
        INPUT mouseInput = new INPUT();
        mouseInput.type = SendInputEventType.InputMouse;
        mouseInput.mkhi.mi.dx = x;
        mouseInput.mkhi.mi.dy = y;
        mouseInput.mkhi.mi.mouseData = 0;

        MouseMove(x, y);
        mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
        SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));

        mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP;
        SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));
    }