2015-03-21 3 views
-1

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

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

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

Результат такой же, когда я заполняю все члены структуры. Полное определение INPUT:

[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 полях с ввода мышкой текущей позиции курсора, кажется, не решить проблему либо.

+0

[SendInput] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310.aspx) последовательно вставляет события во входной поток ** как атомный блок **. Если вы не понимаете, почему передача 1 в качестве неправильных параметров 'nInputs', вероятно, вы не должны использовать этот API. Передача 'MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP' тоже довольно творческий, если у вас нет доступа к квантовому компьютеру с квантовой мышью, где кнопки можно одновременно нажать и нажать. Вы можете упростить свою жизнь, используя [Автоматизация пользовательского интерфейса] (https://msdn.microsoft.com/en-us/library/ms747327.aspx). – IInspectable

ответ

1

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

Во-вторых, в случае, если ваша структура входных данных содержит X и Y координат, установите их с помощью:

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

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

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

+0

Я отредактировал свой вопрос, как вы просили, и попробовал ваше предложение, но курсор по-прежнему идет (0.0) – Sam

-1

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

Смежные вопросы