Симуляция ввода XButton с помощью SendInput

Я использую SendInput для имитации ввода с помощью мыши, и до сих пор я могу успешно имитировать левый, правый и средний клики. Однако я не могу правильно смоделировать xButtons. Я определяю структуру ввода следующим образом:

Win32.INPUT i = new Win32.INPUT();
            i.type = Win32.INPUTF.MOUSE;
            i.mi.dx = 0;
            i.mi.dy = 0;
            i.mi.mouseData = 0;
            i.mi.time = 0;
            i.mi.dwExtraInfo = UIntPtr.Zero;
            i.mi.dwFlags = MouseButton(e.Button, true);
            Win32.SendInput(1, ref i, System.Runtime.InteropServices.Marshal.SizeOf(new Win32.INPUT()));

MouseButton определяется следующим образом, и я считаю, что проблема именно в этом.

private Win32.MOUSEEVENTF MouseButton(MouseButtons mb, bool up)
    {
        switch (mb)
        {
            case MouseButtons.Left:
                return up ? Win32.MOUSEEVENTF.LEFTUP : Win32.MOUSEEVENTF.LEFTDOWN;
            case MouseButtons.Right:
                return up ? Win32.MOUSEEVENTF.RIGHTUP : Win32.MOUSEEVENTF.RIGHTDOWN;
            case MouseButtons.Middle:
                return up ? Win32.MOUSEEVENTF.MIDDLEUP : Win32.MOUSEEVENTF.MIDDLEDOWN;
            case MouseButtons.XButton1:
                return up ?  Win32.MOUSEEVENTF.XBUTTON1|Win32.MOUSEEVENTF.XUP  : Win32.MOUSEEVENTF.XBUTTON1 | Win32.MOUSEEVENTF.XDOWN;
            case MouseButtons.XButton2:
                return up ? Win32.MOUSEEVENTF.XBUTTON2 | Win32.MOUSEEVENTF.XUP : Win32.MOUSEEVENTF.XBUTTON2 | Win32.MOUSEEVENTF.XDOWN;
            default:
                return 0u;
        }
    }

person Alex    schedule 07.01.2011    source источник
comment
Вы использовали эту ссылку для создания своего класса Win32? pinvoke.net/default.aspx/user32/SendInput.html   -  person digEmAll    schedule 07.01.2011
comment
Я не создавал класс Win32, который я использую, но тот, который я использую, не идентичен классу, найденному на pinvoke.net/default.aspx/user32/SendInput.html, хотя и имеет такое же поведение.   -  person Alex    schedule 18.01.2011


Ответы (1)


Оказывается, я пытался указать, какая кнопка была нажата не в том месте. i.mi.dwFlags следует указывать только Win32.MOUSEEVENTF.XDOWNили Win32.MOUSEEVENTF.XUP. Нажатая кнопка должна быть установлена ​​с помощью i.mi.mouseData.

Итак, чтобы имитировать ввод кнопки x, я бы сделал следующее:

Win32.INPUT i = new Win32.INPUT();
            i.type = Win32.INPUTF.MOUSE;
            i.mi.dx = 0;
            i.mi.dy = 0;
            switch (e.Button)
            {
                case System.Windows.Forms.MouseButtons.XButton1:
                    i.mi.mouseData = (uint)Win32.MOUSEEVENTF.XBUTTON1;
                    break;
                case System.Windows.Forms.MouseButtons.XButton2:
                    i.mi.mouseData = (uint)Win32.MOUSEEVENTF.XBUTTON2;
                    break;
                default:
                    i.mi.mouseData = 0;
                    break;
            }

            i.mi.time = 0;
            i.mi.dwExtraInfo = UIntPtr.Zero;
            i.mi.dwFlags = Win32.MOUSEEVENTF.XUP;
            Win32.SendInput(1, ref i, System.Runtime.InteropServices.Marshal.SizeOf(new Win32.INPUT()));
person Alex    schedule 18.01.2011
comment
Алекс, спасибо за размещение вашего вопроса / ответа! Это действительно помогает мне прямо сейчас. Хотелось бы, чтобы больше людей ответили на свои вопросы, когда нашли решение! - person Lunivore; 03.07.2011