【发布时间】:2014-08-10 12:58:03
【问题描述】:
只要按住箭头键,我就需要执行某种方法。现在,对于 Visual Studio 2012 中的常规箭头键按下,使用 OnKeyDown 不起作用,所以我需要使用 ProcessCmdKey,这就像一个魅力。有没有办法使用ProcessCmdKey 来检测箭头何时被释放/被按住?
我接受了 Markus 和 Hans 的建议,并将这两个想法结合起来。我使用了ProcessKeyPreview 方法,但我仍然遇到一些问题。当我按住任何箭头键时,此方法不会检测到 WM_KEYDOWN 已经发生......但是当我从键上松开手指时,它实际上确实注意到 WM_KEYUP 已经发生。
有趣的是,当我按住任何其他键(即字母“S”)时,它会正确识别何时按下和释放。我在下面发布了我的代码片段:
const int WM_KEYUP = 0x0101;
const int WM_KEYDOWN = 0x0100;
protected override bool ProcessKeyPreview(ref Message m)
{
int msgVal = m.WParam.ToInt32();
if (m.Msg == WM_KEYDOWN)
{
switch ((Keys)msgVal) {
case Keys.Down:
Console.WriteLine("down pressed"); //not detected
break;
case Keys.S:
Console.WriteLine("S pressed!"); //detected
break;
}
}
if (m.Msg == WM_KEYUP)
{
switch ((Keys)msgVal)
{
case Keys.Down:
Console.WriteLine("down released"); //detected
break;
case Keys.S:
Console.WriteLine("s released!"); //detected
break;
}
}
return base.ProcessKeyPreview(ref m);
}
【问题讨论】: