TextBox KeyDown / KeyPress и т. Д. Будет вызываться только для клавиш, которые могут быть приняты в качестве ввода в текстовое поле (и связанные с ним модификаторы).Таким образом, вы не увидите обработанные клавиши, такие как Print Screen и т. Д. Лучший вариант, который я могу себе представить, не идеален, но вы можете переопределить ProcessKeyPreview или какой-либо другой перехватчик сообщений уровня формы, чтобы получать уведомления о ЛЮБОМ нажатии клавиши.Что-то вроде ...
protected override bool ProcessKeyPreview(ref Message m)
{
var keyCode = (Keys)Enum.ToObject(typeof (Keys), m.WParam);
//Insert some logic
return base.ProcessKeyPreview(ref m);
}
Конечно, этот метод будет вызываться всякий раз, когда ФОРМА имеет фокус, и нажата клавиша, поэтому вам придется отфильтровать, выполнив некоторую форму проверки (которая сноване идеален)
if(ReferenceEquals(ActiveControl, textBoxRegionKeys)) {}
Что, если вы будете иметь дело с такими вещами, как UserControls, будут очень ненадежными.
Что касается форматирования приятных дружеских сообщений, я думаю, что вам в основном вам понадобится ваша собственная карта специальных символов ... Я не знаю ни о каком глобальном поиске ключей.Я немного покопаюсь и обновлю ответ, если найду что-нибудь.
Редактировать
Немного покопался и не смог найти ничего очевидного для хороших сочетаний клавиш.Я бы просто создал карту "дружественных" названий клавиш:
private static readonly Dictionary<Keys, String> KeysMap = new Dictionary<Keys, String>
{
{ Keys.D1, "1"},
{ Keys.D9, "9"}
};
и сделал бы что-то вроде:
String friendlyKeyCode;
if (!KeysMap.TryGetValue(keyCode, out friendlyKeyCode))
friendlyKeyCode = keyCode.ToString();
Лично я считаю этот подход лучше, чем массивный переключатель ...но это тоже работает.