如何在不添加焦点的情况下捕获Windows窗体应用程序中的按键事件

本文关键字:窗体 Windows 应用程序 事件 添加 情况下 焦点 | 更新日期: 2023-09-27 18:16:36

我是c#和编程的新手,所以这可能看起来很简单,但我已经努力寻找帮助。

我试图在Visual Studio 2012中实现对象上的WASD控件(特别是椭圆),我了解如何操纵对象-我的问题是收集用户输入。

似乎在过去,人们使用System.Windows.Forms,但我不确定它是否存在(它说有一个缺失的令牌,当我去添加引用时,它说所有都添加了)。

我尝试在网格中添加一个按下键事件,但它从未触发。我不能将焦点设置为网格,因为那是在System.Windows.Forms中。

所以我的问题是:关于如何实现方向键控制有什么建议吗?或者更具体地说,当用户按下一个键时,我如何注册而不手动为对象添加焦点?

如何在不添加焦点的情况下捕获Windows窗体应用程序中的按键事件

既然你说的是VS2012, c#,但Elipse和没有System.Windows.Forms,我要冒险猜测你真的做了文件->新项目-> WPF应用程序(因为它有一个椭圆控件(原语))。

因为Elipse不能获得焦点,你需要决定什么时候按下一个键是有趣的,要做到这一点,添加一个处理程序到窗口。下面是一些示例XAML:

  <Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" KeyDown="Window_KeyDown">
    <Grid>
      <Ellipse x:Name="elipsy" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="100" Stroke="Black" VerticalAlignment="Top" Width="100" Canvas.Left="241" Canvas.Top="119"/>
    </Grid>
  </Window>

在你的处理程序(Window_KeyDown)中,你可以这样做:

    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.W)
        {
            Canvas.SetTop(elipsy, Canvas.GetTop(elipsy) - 1);
        }
        else if (e.Key == Key.A)
        {
            Canvas.SetLeft(elipsy, Canvas.GetLeft(elipsy) - 1);
        }
        else if (e.Key == Key.S)
        {
            Canvas.SetTop(elipsy, Canvas.GetTop(elipsy) + 1);
        }
        else if (e.Key == Key.D)
        {
            Canvas.SetLeft(elipsy, Canvas.GetLeft(elipsy) + 1);
        }
    }

这会让你走上正确的道路。如果你真的想让WinForms发出一个提示,我们应该可以在那里找到一个类似的解决方案。