SendInput перемещает курсор, когда я пытаюсь выполнить щелчок мышью

Я пытаюсь имитировать щелчок левой кнопкой мыши с помощью SendInput, и это работает, но также перемещает курсор в верхний левый угол экрана (0,0), и я не могу понять, почему.

(Я использую те же структуры для перемещения курсора (относительно и абсолютно), и это работает.)

private static void Send(INPUT input)
{
  SendInput(1, ref input, Marshal.SizeOf(new INPUT()));
}
private static void MouseAction(MouseFlags mf)
{
  INPUT aInput = new INPUT();
  aInput.type = InputType.INPUT_MOUSE;
  aInput.mkhi.mi.dwFlags = mf;

  Send(aInput);
}

// Performs a LeftClick but moves the cursor to (0.0)
public static void LeftClick()
{
  MouseAction(MouseFlags.MOUSEEVENTF_LEFTDOWN | MouseFlags.MOUSEEVENTF_LEFTUP);
}

Результат тот же, когда я заполняю все элементы структуры. Полное определение ВХОДА:

[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
    public InputType type;
    public MouseKeyboardHardwareUnion mkhi;
}
[StructLayout(LayoutKind.Explicit)]
struct MouseKeyboardHardwareUnion
{
    [FieldOffset(0)]
    public MOUSEINPUT mi;

    [FieldOffset(0)]
    public KEYBDINPUT ki;
}
[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
    public int dx;
    public int dy;
    public uint mouseData;
    public MouseFlags dwFlags;
    public uint time;
    public IntPtr dwExtraInfo;
}
// Not relevant
[StructLayout(LayoutKind.Sequential)]
struct KEYBDINPUT
{
    public KeyboardVirtual wVk;
    public ushort wScan;
    public KeyboardFlags dwFlags;
    public uint time;
    public IntPtr dwExtraInfo;
}

Заполнение полей dx и dy MOUSEINPUT текущим положением курсора также не решает проблему.


person Sam    schedule 21.03.2015    source источник


Ответы (2)


Во-первых, было бы очень полезно, если бы вы показали определение вашей структуры INPUT.

Во-вторых, если ваша структура INPUT содержит координаты X и Y, установите их, используя:

aInput.somethingX = Cursor.Position.X;
aInput.somethingY = Cursor.Position.Y;

потому что в противном случае он, конечно, сбросит вашу позицию курсора.

В-третьих, просто выполните поиск в Google и stackoverflow, и вы найдете множество людей, которые уже спрашивали об этом и получили полезные ответы, такие как это.

person Maximilian Schier    schedule 21.03.2015
comment
Я отредактировал свой вопрос, как вы просили, и попробовал ваше предложение, но курсор все еще идет к (0.0) - person Sam; 21.03.2015

Я понял, проблема была не в структуре INPUT, я вызвал функцию LeftClick() внутри конструктора EventArgs. После того, как я вынес его на улицу, он работает нормально.

person Sam    schedule 21.03.2015