如何在不添加焦点的情况下捕获Windows窗体应用程序中的按键事件
本文关键字:窗体 Windows 应用程序 事件 添加 情况下 焦点 | 更新日期: 2023-09-27 18:16:36
我是c#和编程的新手,所以这可能看起来很简单,但我已经努力寻找帮助。
我试图在Visual Studio 2012中实现对象上的WASD控件(特别是椭圆),我了解如何操纵对象-我的问题是收集用户输入。
似乎在过去,人们使用System.Windows.Forms
,但我不确定它是否存在(它说有一个缺失的令牌,当我去添加引用时,它说所有都添加了)。
我尝试在网格中添加一个按下键事件,但它从未触发。我不能将焦点设置为网格,因为那是在System.Windows.Forms
中。
所以我的问题是:关于如何实现方向键控制有什么建议吗?或者更具体地说,当用户按下一个键时,我如何注册而不手动为对象添加焦点?
既然你说的是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发出一个提示,我们应该可以在那里找到一个类似的解决方案。