Я экспериментирую с Application.AddMessageFilter
, использую некоторый код, изначально написанный Somebody Else, поэтому я не обязательно понимаю все, что здесь происходит.
Вот как выглядит код.В Main()
:
Application.AddMessageFilter(new KeyDownMessageFilter());
В KeyDownMessageFilter
:
internal class KeyDownMessageFilter : IMessageFilter {
private const int WM_KEYDOWN = 0x0100;
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_KEYDOWN)
{
var k = (Keys)m.WParam;
var c = (char)k;
// and some other stuff
}
return false;
}
}
я могу увидеть это, приведя m.WParam
к переменной типа System.Windows.Forms.Keys
и затем приведя ее кchar
, я могу сказать, какая клавиша на клавиатуре была нажата.Пока все хорошо.
НО - я не могу понять, как определить разницу между клавишей Shift ed и нажатием клавиши без Shift - например, нажатием% возвращает символ '5'.Еще более странно, если посмотреть на значение k
, оно выглядит как «LButton | MButton | ShiftKey | Space» (независимо от того, нажимаю ли я 5 или % ).
Документация MSDN на эту тему довольно тонкая.Может кто-нибудь объяснить, как точно сказать, какой символ был выдвинут, а для бонусных отметок объяснить, для чего предназначен этот объект Message
, и почему он использует такие неописуемые свойства, как LParam
и WParam
, чтобы нести полезныеинформация