C# 如何在没有特殊选择的情况下获得WinC窗体中的按键
我有一个控制器,你可以通过鼠标点击来移动 我希望控制器也能通过按键和箭头键来移动 我得到的是:C# 如何在没有特殊选择的情况下获得WinC窗体中的按键,c#,winforms,visual-studio,C#,Winforms,Visual Studio,我有一个控制器,你可以通过鼠标点击来移动 我希望控制器也能通过按键和箭头键来移动 我得到的是: private void project1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Up) { MoveUp(); } if (e.KeyCode == Keys.Down) {
private void project1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up)
{
MoveUp();
}
if (e.KeyCode == Keys.Down)
{
MoveDown();
}
if (e.KeyCode == Keys.Left)
{
MoveLeft();
}
if (e.KeyCode == Keys.Right)
{
MoveRight();
}
}
private void project1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Down:
case Keys.Up:
case Keys.Left:
case Keys.Right:
e.IsInputKey = true;
break;
}
}
MoveDirection方法工作正常,因为我按下鼠标按钮时它们是相同的
但我不能让它与箭头键一起工作-或者任何我也试过WASD的键,但它不工作-什么都没有发生
我做错了什么
很抱歉,如果这是一个无意义的问题,我仍在学习c:您应该使用ProcessCmdKey重写方法来捕获箭头 在消息预处理期间调用此ProcessCmdKey以处理命令键,并且仅当控件托管在Windows窗体应用程序中时才调用此ProcessCmdKey
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;
}
//capture down arrow key
if (keyData == Keys.Down )
{
MessageBox.Show("You pressed Down arrow key");
return true;
}
//capture left arrow key
if (keyData == Keys.Left)
{
MessageBox.Show("You pressed Left arrow key");
return true;
}
//capture right arrow key
if (keyData == Keys.Right )
{
MessageBox.Show("You pressed Right arrow key");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
您需要将Form KeyPreview属性设置为true
建议使用KeyPreview属性为表单创建键盘处理过程。例如,当应用程序使用功能键时,将KeyPreview属性设置为True可使您在窗体级别处理击键,而不是为可能接收击键事件的每个控件编写代码。这是父窗体还是控件实际获取事件?检查一下-如果要处理重复的按键操作(光标键一直按下),则应放弃KeyDown事件并保留PreviewKeyDown处理程序,该处理程序可以很好地处理快速/重复的按键操作。在您的开关块中,设置类似于本例的键。向下:向下移动;打破等。在具有焦点的控件上引发键盘事件。不太可能是[winforms]应用程序中的表单。改为重写ProcessCmdKey。或者让控件自己知道这些击键,重写它的IsInputKey方法,就像PreviewKeyDown一样,这样它就可以看到它们并执行它需要执行的操作。但是,只有当控制始终具有焦点时,这才起到预期的作用。对于WASD样式的控件,您肯定会喜欢ProcessCmdKey。