Как отправить правые или левые системные ключи в SendKeys.Send ()? - PullRequest
3 голосов
/ 24 марта 2019

Я исследовал несколько вариантов, в основном;

  1. Sendkeys.Send () для правой клавиши Alt? какие альтернативы?
  2. https://social.msdn.microsoft.com/Forums/vstudio/en-US/dd6406e8-b6bf-4166-82a0-6d533def38a5/how-to-send-leftright-shift-key?forum=csharpgeneral

Но я не могу найти, можно ли отправить правый или левый варианты системных ключей в SendKey.Send() API. Например, можно отправить общий shift + A , указав "+A" согласно документации , но мне нужно иметь возможность различать левое и правое смещение , управление и alt и т. Д.

Возможно ли это даже с SendKeys.Send()?

Кроме того, мне интересно, есть ли решение, использующее что-то вроде Keys enum.

Ответы [ 2 ]

3 голосов
/ 25 марта 2019

Нет, невозможно различить левую и правую клавиши Shift , Ctrl и Alt с помощью .NET Framework SendKeys.Send (String)метод, но вы на правильном пути с перечислением Keys.Вместо этого вам нужно будет использовать сервисы взаимодействия.

Поскольку запрашиваемый вами метод находится в пространстве имен System.Windows.Forms, я предположил, что вы работаете с WinForms.Ниже приведены частичные инструкции по созданию приложения WinForms с шестью кнопками, которые отправляют Сдвиг вправо , Сдвиг влево , Alt вправо , Alt Alt , Правый Ctrl и Левый Ctrl клавиши для собственного окна приложения.Поместите метку в форму, чтобы она отображала любую из шести клавиш.Это стало возможным благодаря переопределению DefWndProc.

Вы сможете заполнить недостающие фрагменты.Изменение приложения для отправки этих нажатий клавиш в другое приложение также не должно быть слишком сложным.

Убедитесь, что у вас есть эти операторы using в верхней части файла Form1.cs:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

Внутри класса Form1.cs вверху объявите:

  • постоянное поле, представляющее тип сообщения, которое вы хотите отправить
  • поле для хранения дескриптора в окне вашего приложения
  • метод API SendMessage для Windows
const int WM_KEYDOWN = 0x100;
IntPtr _hWnd;

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

В конструкторе Form1 под вызовом InitializeComponent определите обработчик событий, который позволит вам извлекать и сохранять дескриптор окна для вашего приложения.:

HandleCreated += new EventHandler((sender, e) =>
{
    _hWnd = this.Handle;
});

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

void button_Click(object sender, EventArgs e)
{
    var button = (Button)sender;
    var wParam = new IntPtr();

    switch (button.Name)
    {
        case "buttonSendRightShift":
            wParam = (IntPtr)Keys.RShiftKey;
            break;
        case "buttonSendLeftShift":
            wParam = (IntPtr)Keys.LShiftKey;
            break;
        case "buttonSendRightAlt":
            wParam = (IntPtr)Keys.RMenu;
            break;
        case "buttonSendLeftAlt":
            wParam = (IntPtr)Keys.LMenu;
            break;
        case "buttonSendRightCtrl":
            wParam = (IntPtr)Keys.RControlKey;
            break;
        case "buttonSendLeftCtrl":
            wParam = (IntPtr)Keys.LControlKey;
            break;
    }
    SendMessage(_hWnd, WM_KEYDOWN, wParam, 1);
}

Переопределить DefWndProc следующим образом:

protected override void DefWndProc(ref Message m)
{
    switch (m.Msg)
    {
        case WM_KEYDOWN:
            switch ((Keys)m.WParam)
            {
                case Keys.RShiftKey:
                    LabelKeyPressed.Text = "Right Shift Key Received";
                    break;
                case Keys.LShiftKey:
                    LabelKeyPressed.Text = "Left Shift Key Received";
                    break;
                case Keys.RMenu:
                    LabelKeyPressed.Text = "Right Alt Key Received";
                    break;
                case Keys.LMenu:
                    LabelKeyPressed.Text = "Left Alt Key Received";
                    break;
                case Keys.RControlKey:
                    LabelKeyPressed.Text = "Right Ctrl Key Received";
                    break;
                case Keys.LControlKey:
                    LabelKeyPressed.Text = "Left Ctrl Key Received";
                    break;
            }
            break;
    }
    base.DefWndProc(ref m);
}
1 голос
/ 24 марта 2019

Я не знаю о SendKey.Send(), но знаю альтернативное решение для вас.
Использование AutoIt. Это язык сценариев для автоматизации графического интерфейса Windows. Важно то, что он предоставляет .dll файлы, позволяющие использовать .NET. Вам просто нужно скачать, установить его и добавить ссылку на .dll файлы.
Ваш код будет выглядеть так: AutoItX.Send("{RSHIFT}")

...