среда, 21 октября 2009 г.

В чём разница между GetKeyState и GetAsyncKeyState?

Это перевод What's the difference between GetKeyState and GetAsyncKeyState? Автор: Реймонд Чен.

Я вижу, что, похоже, разница между функциями GetKeyState и GetAsyncKeyState слабо понимается людьми.

GetKeyState возвращает состояние виртуальной клавиши. Другими словами, GetKeyState сообщает о состоянии клавиатуры, основываясь на сообщениях, которые вы получили из своей очереди сообщений. Это не то же самое, что состоянии кнопок на физической клавиатуре:
  • Если пользователь печатает быстро, GetKeyState не сообщит о этих нажатиях, до тех пор, пока вы не используете функции PeekMessage или GetMessage для выборки этих сообщений из очереди.
  • Если пользователь переключился на другое окно, то функция GetKeyState не увидит что пользователь печатает в другой программе, поскольку ввод отправляется не в вашу очередь.
Когда же вам нужно использовать GetKeyState, а когда GetAsyncKeyState?

Для работы с интерфейсом пользователя вам почти всегда нужно использовать GetKeyState.

Если вы отвечаете на входящее оконное сообщение и хотите знать, какие кнопки были нажаты в момент отправки сообщения - то вы захотите использовать GetKeyState. Например, если вы хотите отличить щелчок левой кнопки мыши от Alt + щелчок, вы должны использовать GetKeyState для запроса состояния клавиши Alt (известной как VK_MENU по историческим причинам). Это потому что вы хотите знать, была ли нажата Alt во время щелчка мышью, а не нажата ли эта кнопка прямо сейчас. Отпустил ли пользователь Alt между моментом щелчка и временем вашей обработки сообщения - совершенно неважно. Вас заботит только была ли нажата Alt в момент щелчка.

Заметьте, что если вы реализуете обработчик контекстного меню, то вам вообще не следует использовать ни GetKeyState, ни GetAsyncKeyState, потому что контекстное меню может вызываться программно, вообще без действий со стороны пользователя. В IContextMenu.QueryContextMenu вы должны проверять флаг CMF_EXTENDEDVERBS, вместо того, чтобы тестировать клавиатуру, чтобы определить, следует ли вам отображать дополнительные команды. Аналогично, в IContextMenu.InvokeCommand вам следует проверять флаги CMIC_MASK_CONTROL_DOWN и CMIC_MASK_SHIFT_DOWN, если вы хотите менять поведение в зависимости от состояния модификаторов.

Теперь, когда мы увидели пример различий между GetKeyState и GetAsyncKeyState, вы можете самостоятельно объяснить поведение, которое видит этот пользователь.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.