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

时间:2013-06-04 01:00:50

标签: c# events visual-studio-2012

我是C#和编程的新手,所以这看起来很简单,但我很难找到帮助。

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

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

我尝试向网格添加一个按键事件,但它永远不会触发。我无法将焦点设置为网格,因为它位于System.Windows.Forms

所以我的问题:有关如何实施WASD控件的任何提示?或者更具体地说,当用户按下某个键而不手动将焦点添加到对象时,如何注册?

1 个答案:

答案 0 :(得分:2)

既然你说VS2012,C#但是Elipse而没有System.Windows.Forms我会冒险猜测你真的做过File - >新项目 - > WPF应用程序(因为它有一个关闭的椭圆控件(原始))。

由于Elipse无法获得焦点,因此您需要确定按键何时感兴趣,为此添加处理程序到Window。这是一些示例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给我们一个叫喊声,我们应该能够在那里找到类似的解决方案。