Щелкните правой кнопкой мыши с помощью SendKeys в .NET - PullRequest
1 голос
/ 08 января 2010

Я использую sendkeys в C # .NET. У меня есть буквы, клавиши со стрелками и введите рабочий. Я не могу понять, как отправить правой кнопкой мыши для контекстного меню. Я знаю, что могу нажать клавишу на клавиатуре, чтобы сделать это, но я не знаю, как отправить сообщение. Как я? я погуглил и увидел

new MenuItem().PerformClick();

как решение, однако я не видел никакого влияния. Ключи отправляются в другое приложение.

Ответы [ 4 ]

3 голосов
/ 08 января 2010

Вы можете обернуть user32.dll, Я получил общее представление здесь

EDIT: Я добавил в posX и posY, которые будут координатами мыши.

using System;
using System.Runtime.InteropServices;

namespace WinApi
{  
    public class Mouse
    { 
            [DllImport("user32.dll")]
            private static extern void mouse_event(UInt32 dwFlags,UInt32 dx,UInt32 dy,UInt32 dwData,IntPtr dwExtraInfo);

            private const UInt32 MouseEventRightDown = 0x0008;
            private const UInt32 MouseEventRightUp = 0x0010;

            public static void SendRightClick(UInt32 posX, UInt32 posY)
            {
                mouse_event(MouseEventRightDown, posX, posY, 0, new System.IntPtr());
                mouse_event(MouseEventRightUp, posX, posY, 0, new System.IntPtr());
            }    
    }
}
2 голосов
/ 08 января 2010

Если вы обращаетесь к клавише, расположенной в нескольких местах справа от пробела, которая в некоторых ситуациях выполняет ту же операцию, что и правая кнопка мыши, {MENU} может быть специальной клавишей, которую вы хотите Отправить. Он не реализован в некоторых вариантах SendKeys, и я не уверен в последней версии C # .NET.

1 голос
/ 08 января 2010

Вы не можете отправлять ввод с помощью мыши с помощью класса .NET SendKeys. По крайней мере, не то, что я знаю, ни то, что задокументировано. Лучший способ сделать это - переключиться на WinAPI и использовать метод SendInput. Вы можете использовать это в .NET, используя DllImport для функции (в "user32.dll") и StructLayout для структур.

Тогда вы захотите назвать это так:

INPUT pressRight;
pressRight.type = MOUSE; // = 0
pressRight.mi.dx = 0;
pressRight.mi.dy = 0;
pressRight.mi.mouseData = 0;
pressRight.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN; // = 8
pressRight.mi.time = 0;
pressRight.mi.dwExtraInfo = IntPtr.Zero;

INPUT releaseRight = pressRight;
releaseRight.mi.dwFlags = MOUSEEVENTF_RIGHTUP; // = 10

INPUT[] inputs = new INPUT[2];
inputs[0] = pressRight;
inputs[1] = releaseRight;

SendInput(2, inputs, Marshal.SizeOf(typeof(INPUT)));
0 голосов
/ 14 мая 2014

Клавиша {MENU} не всегда доступна, как отмечает @Sparr. Однако shift-F10 вызывает контекстное меню в большинстве приложений Windows. Так что SendKeys.SendWait("+{F10}"); должно работать.

...