Что такое GetAsyncKeyState(117) в Delphi?

Я просматриваю код в программе, и у них есть следующий код в TTimer:

procedure TMyMain.CaptureKeyTimerTimer(Sender: TObject);
var
  keyloop, KeyResult : Integer;
begin
  KeyResult := GetAsyncKeyState(117);
  if (KeyResult = -32767) then
    Button90Click(Sender);
end;

Я пытаюсь понять, что означает и делает этот код, но это сбивает с толку.

Может ли кто-нибудь объяснить мне код? Что такое GetAsyncKeyState(117)? Что означает 117, передаваемый в функцию? Что значит, если оно равно -32767?

Все сбивает с толку.

Не используйте Delphi, но, скорее всего, это: Learn.microsoft.com/en-us/windows/win32/api/winuser/…

001 09.07.2024 22:48

117 — это ключ F6 — см. это и это. Состояние (значение KeyResult) зависит от того, нажата клавиша или нет.

500 - Internal Server Error 09.07.2024 23:17

На этот вопрос очень легко ответить, просто посмотрев документацию рассматриваемой функции. Это заставляет меня думать, что вы не знаете о существовании такой документации. Фактически все, что вам нужно сделать, это ввести имя функции в поисковую систему. Настоящий вывод заключается в том, что вам будет полезно освоить этот навык.

David Heffernan 10.07.2024 08:38

«Все запутанно» — для новичка может быть. Почему keyloop объявлен, но никогда не используется?

AmigoJack 10.07.2024 15:24

@AmigoJack Я новичок. Я не уверен, почему объявлен keyloop. Это не мой код.

JakesF 11.07.2024 10:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

GetAsyncKeyState() принимает на вход Код виртуального ключа , где 117 (шестнадцатеричный 0x75) представляет собой ключ F6 (автору следовало использовать константу VK_F6 в модуле Windows - держитесь подальше от магических чисел! ).

Согласно документации GetAsyncKeyState():

Возвращаемое значение

Тип: КОРОТКИЙ

Если функция завершается успешно, возвращаемое значение указывает, была ли клавиша нажата с момента последнего вызова GetAsyncKeyState и находится ли клавиша в данный момент нажатой или нажатой. Если установлен старший бит, клавиша нажата, а если установлен младший бит, клавиша была нажата после предыдущего вызова GetAsyncKeyState. Однако вам не следует полагаться на последнее поведение; дополнительную информацию см. в Примечаниях.

-32767 в десятичном формате — 0x8001 в шестнадцатеричном и 1000000000000001 в двоичном. Итак, вы можете видеть, что два бита, упомянутые в документе выше, установлены в 1.

Поскольку код проверяет именно это значение, автор хочет знать, когда оба бита установлены одновременно, IOW, когда клавиша F6 перешла из состояния ВВЕРХ в состояние ВНИЗ с момента предыдущего вызова GetAsyncKeyState().

Автор мог бы легко использовать событие OnKeyDown формы для обнаружения нажатия F6, но он, вероятно, сделал это таким образом, чтобы обнаружить нажатие, даже если форма не имеет фокуса клавиатуры. Есть и другие способы сделать это более точно, например, с помощью низкоуровневого перехвата клавиатуры или Raw Input, но их немного сложнее кодировать, чем этот простой таймер.

Спасибо. Это отличное объяснение. Меня все еще немного смущает значение -32767. Какие еще варианты есть кроме -32767?

JakesF 11.07.2024 10:44

Если вы прочитали процитированную мною документацию, то возможны только 4 случая: 1) оба бита не установлены = 0, шестнадцатеричный 0x0000; 2) установлен только младший бит = 1, шестнадцатеричный 0x0001; 3) установлен только старший бит = -32768, шестнадцатеричный 0x8000; и 4) оба бита установлены = -32767, шестнадцатеричное 0x8001. Если вы не понимаете эти значения, вам нужно прочитать о том, как компьютерные двоичные числа работают на битовом уровне, и о взаимосвязи между двоичной, десятичной и шестнадцатеричной системами счисления.

Remy Lebeau 11.07.2024 16:32

Другие вопросы по теме