if ((Word(GetKeyState(VK_LSHIFT)) and $8000) <> 0) then
begin
end;
if ((Word(GetKeyState(VK_RSHIFT)) and $8000) <> 0) then
begin
end;
Автор ответа: CHERRY
работает под Win NT/2000, но не работает под Win95.
Способ 2
В 95 катит следующее:
Code:
RSHIFT = 36h
LSHIFT = 2Ah
asm
in al, 60h
cmp al, 36h
jne @@exit
mov tt,1
@@exit:
end;
if tt = 1 then ShowMessage ('Right Shift');
Автор ответа: Baa
Способ 3
Code:
procedure TDecEditForm.Memo1KeyPress(Sender: TObject; var Key: Char);
VAR s:String; RL:Byte;
begin
IF key=CHR(VK_RETURN) Then
Begin
//WIN NT/2000
If (GetVersion() and $80000000)=0 then
BEGIN
IF ((Word(GetKeyState(VK_LSHIFT)) and $8000)<>0) Then
Begin
End;
IF ((Word(GetKeyState(VK_RSHIFT)) and $8000)<>0) Then
Begin
End;
End
ELSE
//WIN 9.x
Begin
asm
mov ah,2
int $16
mov RL,al
end;
if 1 = (RL and 1) then // ПРАВЫЙ SHIFT НАЖАТ+ENTER
Begin
End;
if 2 = (RL and 2) then // ЛЕВЫЙ SHIFT НАЖАТ+ENTER
Begin
End;
End;
//WIN 9.x
END;
End;
Автор ответа: CHERRY
Прекрасное собрание кодовых фрагментов для обнаружения нажатия левой или правой кнопки Shift!
Давайте разбираться каждый подход:
Метод 1 (Win NT/2000)
Этот метод использует функцию GetKeyState с константами VK_ LSHT и VK_RSHIFT, чтобы проверить, является ли соответствующая клавиша Shift ключом, который нажимается. Используется маска $8000 для проверки высокого порядкового бита, указывающего на то, является ли клавиша нажатой.
Метод 2 (Win95)
Этот метод использует ассемблерный язык, чтобы прочитать состояние буфера клавиатуры с помощью инструкции in al, 60h. Затем сравнивается результат с значениями констант RSHIFT и LSHIFT. Если левая кнопка Shift нажата, то переменная tt устанавливается в 1.
Метод 3 (Delphi/Win NT/2000 и Win95)
Этот метод использует процедуру Delphi, которая обрабатывает событие KeyPress для контрола memo. Она проверяет, была ли нажата клавиша Enter (VK_RETURN), а затем использует либо функцию GetKeyState (для Win NT/2000), либо ассемблерный язык (для Win95), чтобы обнаружить, была ли левая или правая кнопка Shift нажата.
В целом, Метод 1 является специфичным для Win NT/2000, в то время как Методы 2 и 3 совместимы с обеими версиями. Метод 3 более полон, так как обрабатывает событие KeyPress, но требует кода, специфичного для Delphi.
Надо отметить, что эти методы могут не работать на новых версиях Windows или в других условиях (например, при изменении раскладки клавиатуры). Для более надежной решения может быть полезно использовать современные API, такие как GetAsyncKeyState или GetKeyboardLayout, и комбинировать их с механизмами обработки событий.
Обратите внимание на то, какой код вы используете (GetKeyState(VK_LSHIFT) или asm-инструкции), чтобы отличить нажатый правый или левый SHIFT-клавишу.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS