Нет, невозможно различить левую и правую клавиши 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);
}