不捕获表单 keydown 和 keyup 消息:
public partial class Form1 : Form
{
const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_KEYDOWN)
{
log("down");
}
if (m.Msg == WM_KEYUP)
{
log("up");
}
base.WndProc(ref m);
}
}
你应该覆盖进程命令键 instead
这个例子是摘录出来的从这篇文章
public partial class Form1 : Form, IMessageFilter
{
const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
const int WM_SYSKEYDOWN = 0x104;
Keys lastKeyPressed = Keys.None;
public Form1()
{
InitializeComponent();
Application.AddMessageFilter(this);
this.FormClosed += (s, e) => Application.RemoveMessageFilter(this);
}
public bool PreFilterMessage(ref Message m)
{
if(m.Msg == WM_KEYUP)
{
Debug.WriteLine("Filter -> KeyUp LastKeyPressed=" + lastKeyPressed.ToString());
}
return false;
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
lastKeyPressed = keyData;
switch (keyData)
{
case Keys.Down:
Debug.WriteLine("Down Arrow Captured");
break;
case Keys.Up:
Debug.WriteLine("Up Arrow Captured");
break;
case Keys.Tab:
Debug.WriteLine("Tab Key Captured");
break;
case Keys.Control | Keys.M:
Debug.WriteLine("<CTRL> + M Captured");
break;
case Keys.Alt | Keys.Z:
Debug.WriteLine("<ALT> + Z Captured");
break;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
可能有一种方法可以从传递给 PreFilterMessage 的消息中提取 KeyCode,如中所述本文
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)