Ключ, который вы ищете, S, имеет код $53
. Указанный вами ключ имеет код 53
и является номером . Разница заключается в $
, которая обозначает шестнадцатеричный.
Вы бы избежать таких глупых ошибок, и сделать код более ясным, если вы позволяете компилятору сделать работу:
Key = ord('S')
Вы действительно не хотите использовать магические константы в программе. Это очень важно.
Обратите внимание, что Key
является virtual key code и конвенции является то, что для 26 ключей латинского алфавита, они представлены порядковым значением прописной буквы.
сообщение уже проходит состояние клавиш-модификаторов в Shift
аргумента, поэтому идиоматичен написать тест следующим образом:
if (ssCtrl in Shift) and (Key = ord('S')) then
Ваш тест с использованием GetKeyState
работает хорошо, но это просто не идиоматическое ,
Обратите внимание, что этот тест, который соответствует этому вопросу, игнорирует состояние других ключей-модификаторов. Действительно, код C# в вопросе также игнорирует состояние модификатора ALT.
Таким образом, вы можете истинный тест на CTRL + S Вы должны также проверить, что другие модификаторы вверх:
if ([ssCtrl] = Shift*[ssCtrl, ssShift, ssAlt]) and (Key = ord('S')) then
Все это говорит, что, как правило, гораздо легче управлять ярлыки с помощью действия. Это позволит вам напрямую указывать ярлыки и позволить инфраструктуре обнаруживать ключевые события низкого уровня, составляющие ярлык. Дополнительные действия позволяют централизовать обработку действий за кнопками и меню без повторения.
Сэр Дэвид Хеффернан, вы такая легенда. Спасибо за очень сжатый ответ. – Wennie
@David - Я удивлен, что вы сказали бы: «GetKeyState() работает хорошо». Использование ** GetKeyState() ** потенциально ненадежно, поскольку состояние ключа может отличаться во время обработки события, чем оно было во время самого входного события (именно поэтому состояние во время события предоставляется * с * событием). – Deltics
@Deltics Не так. Вы думаете о 'GetAsyncKeyState'. Из документов: * Приложение вызывает GetKeyState в ответ на сообщение с клавиатурой. Эта функция извлекает состояние ключа при генерации входного сообщения. * –