Различие .NET между ключами сдвига вправо и сдвига влево

Я в настоящее время работаю над приложением, которое требует другого поведения на основе того, нажимает ли пользователь клавишу сдвига вправо или сдвига влево (RShiftKey, LShiftKey), однако когда любая из этих клавиш нажата, я только вижу ShiftKey | Сдвиг.

Есть ли что-то не так с моей клавиатурой? (ноутбук) делает мне нужен новый драйвер/клавиатура клавиатуры для отправки различных ключевых команд, возможно...

Это - довольно серьезная проблема в данный момент, поскольку нет никакого способа протестировать это работы кода (кроме модульных тестов). У кого-либо был опыт другого сдвига/высокого звука/клавиш Ctrl?

7
задан Mr AH 2 April 2010 в 21:24
поделиться

3 ответа

Я не знаю, поможет ли вам этот пост, но похоже, что вам, возможно, придется возиться с 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");
        }
    }
}
6
ответ дан 6 December 2019 в 11:47
поделиться

Обратите внимание на метод 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));
}
6
ответ дан 6 December 2019 в 11:47
поделиться

Спасибо, ребята, хорошее решение. А пока вот мой собственный "хакерский" способ сделать это из переопределения 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....
}
3
ответ дан 6 December 2019 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: