我建立,所有的按键输入必须由Windows本身进行处理的应用程序。
我设置的制表位为false,每个控制女巫可以抓住除了面板对焦(但我不知道是否有效果)。
我设置的KeyPreview为真,我处理这种形式的KeyDown事件。
我的问题是,有时箭头键都没有反应了:
当我只按箭头键不触发KeyDown事件。
如果我按与控制修改的方向键keydown事件被触发。
你有一个想法,为什么我的箭头键突然停止射击的事件吗?
我建立,所有的按键输入必须由Windows本身进行处理的应用程序。
我设置的制表位为false,每个控制女巫可以抓住除了面板对焦(但我不知道是否有效果)。
我设置的KeyPreview为真,我处理这种形式的KeyDown事件。
我的问题是,有时箭头键都没有反应了:
当我只按箭头键不触发KeyDown事件。
如果我按与控制修改的方向键keydown事件被触发。
你有一个想法,为什么我的箭头键突然停止射击的事件吗?
protected override bool IsInputKey(Keys keyData)
{
switch (keyData)
{
case Keys.Right:
case Keys.Left:
case Keys.Up:
case Keys.Down:
return true;
case Keys.Shift | Keys.Right:
case Keys.Shift | Keys.Left:
case Keys.Shift | Keys.Up:
case Keys.Shift | Keys.Down:
return true;
}
return base.IsInputKey(keyData);
}
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
switch (e.KeyCode)
{
case Keys.Left:
case Keys.Right:
case Keys.Up:
case Keys.Down:
if (e.Shift)
{
}
else
{
}
break;
}
}
我有完全相同的问题。 我认为@Snarfblam给出了答案; 但是,如果你看过MSDN上的文档,给ProcessCmdKey方法是为了覆盖在应用程序中的菜单项关键事件。
:我最近碰到这篇文章来自微软,它看起来很有希望跌跌撞撞http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx 。 据微软称,做的最好的事情是设置e.IsInputKey=true;
在PreviewKeyDown
检测箭头键后事件。 否则,将触发KeyDown
事件。
这个工作很适合我,是不是覆盖给ProcessCmdKey少砍十岁上下。
我使用PreviewKeyDown
private void _calendar_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e){
switch (e.KeyCode){
case Keys.Down:
case Keys.Right:
//action
break;
case Keys.Up:
case Keys.Left:
//action
break;
}
}
见鲁道夫·诺伯的回答为最佳答案
(我原来的答复):
从控制类派生,并且可以重写给ProcessCmdKey方法。 微软选择,因为它们影响多个控件和将焦点移到忽略来自的KeyDown事件这些键,但是这使得它很难做出一个应用程序应对这些键以任何其他方式。
不幸的是,这是相当困难的。使用箭头键来实现这一点,由于事件的KeyDown限制。 不过,也有一些方法来解决这个问题:
我建议您尝试使用类。 这是很简单的可以这样做:
var left = KeyboardInfo.GetKeyState(Keys.Left);
var right = KeyboardInfo.GetKeyState(Keys.Right);
var up = KeyboardInfo.GetKeyState(Keys.Up);
var down = KeyboardInfo.GetKeyState(Keys.Down);
if (left.IsPressed)
{
//do something...
}
//etc...
如果您使用此结合KeyDown事件,我想你可以可靠地完成自己的目标。
调用WPF窗口的WinForms出来的时候我也有类似的问题。
var wpfwindow = new ScreenBoardWPF.IzbiraProjekti();
ElementHost.EnableModelessKeyboardInterop(wpfwindow);
wpfwindow.Show();
然而,作为显示一个对话框窗口,它的工作
var wpfwindow = new ScreenBoardWPF.IzbiraProjekti();
ElementHost.EnableModelessKeyboardInterop(wpfwindow);
wpfwindow.ShowDialog();
希望这可以帮助。
为了捕捉在窗体控件按键,你必须推导是基于类的,你想控制的一个新的类,并且重写给ProcessCmdKey()。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
//handle your keys here
}
例如:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
//capture up arrow key
if (keyData == Keys.Up )
{
MessageBox.Show("You pressed Up arrow key");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
完整的源... 在C#中的箭头键
Vayne
做最好的方法,我认为,是处理它像MSDN上说http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx
但是,处理它,怎么你真的需要它。 我的方式(在下面的例子)是捕捉每一个的KeyDown ;-)
/// <summary>
/// onPreviewKeyDown
/// </summary>
/// <param name="e"></param>
protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
{
e.IsInputKey = true;
}
/// <summary>
/// onKeyDown
/// </summary>
/// <param name="e"></param>
protected override void OnKeyDown(KeyEventArgs e)
{
Input.SetFlag(e.KeyCode);
e.Handled = true;
}
/// <summary>
/// onKeyUp
/// </summary>
/// <param name="e"></param>
protected override void OnKeyUp(KeyEventArgs e)
{
Input.RemoveFlag(e.KeyCode);
e.Handled = true;
}
我有同样的问题,并已经使用在所选择的答案代码。 这个环节是为我的答案; 也许别人也。
如何在WinForm的禁用导航C#中的箭头?