Я в настоящее время работаю над приложением, которое требует другого поведения на основе того, нажимает ли пользователь клавишу сдвига вправо или сдвига влево (RShiftKey, LShiftKey), однако когда любая из этих клавиш нажата, я только вижу ShiftKey | Сдвиг.
Есть ли что-то не так с моей клавиатурой? (ноутбук) делает мне нужен новый драйвер/клавиатура клавиатуры для отправки различных ключевых команд, возможно...
Это - довольно серьезная проблема в данный момент, поскольку нет никакого способа протестировать это работы кода (кроме модульных тестов). У кого-либо был опыт другого сдвига/высокого звука/клавиш Ctrl?
Я не знаю, поможет ли вам этот пост, но похоже, что вам, возможно, придется возиться с InteropServices и диагностикой:
MSDN Форум: Как отправить левую / правую клавишу Shift
Изменить: Я наконец понял, как заставить GetAsyncKeyState () работать, как показал Адрианбанкс.
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern short GetAsyncKeyState(Keys vKey);
private void theForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.ShiftKey)
{
if (Convert.ToBoolean(GetAsyncKeyState(Keys.LShiftKey)))
{
Console.WriteLine("Left");
}
if (Convert.ToBoolean(GetAsyncKeyState(Keys.RShiftKey)))
{
Console.WriteLine("Right");
}
}
}
Обратите внимание на метод Win32 GetAsyncKeyState . Вы можете добавить к нему вызов pInvoke, используя:
[DllImport("user32.dll")]
private static extern short GetAsyncKeyState(Keys key);
, а затем обработать событие KeyDown
в вашей форме:
private void MyForm_KeyDown(object sender, KeyEventArgs e)
{
Console.WriteLine("Left Shift : " + (GetAsyncKeyState(Keys.LShiftKey) < 0));
Console.WriteLine("Right Shift: " + (GetAsyncKeyState(Keys.RShiftKey) < 0));
}
Спасибо, ребята, хорошее решение. А пока вот мой собственный "хакерский" способ сделать это из переопределения ProcessCmdKey:
public override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (msg.LParam.ToInt32() == 0x2a0001)
LastShiftKey = ShiftKeys.NumericShift;
else if (msg.LParam.ToInt32() == 0x360001)
LastShiftKey = ShiftKeys.AlphaShift;
etc....
}