我试图在按下按键时发生某些事情,但我的键盘似乎没有注册。 我试图用任何关键而不是具体的事情来发生事情。
int indexRemain = index;
FreeSpace& freespace = ...;
for( size_t i = 0; i < freespace.slices.size(); i++ )
{
if( freespace.slices[i].size > indexRemain )
return freespace.slices[i].type;
indexRemain -= freespace.slices[i].size;
}
没有任何事情发生,using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Input;
namespace KeyDown
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public static IEnumerable<Key> KeysDown()
{
foreach (Key key in Enum.GetValues(typeof(Key)))
{
if (Keyboard.IsKeyDown(key))
yield return key;
}
}
private void MainGrid_KeyDown(object sender, KeyEventArgs e)
{
if(KeysDown().Any())
{
MessageBox.Show("Key pressed");
}
}
}
}
可以集中精力。
试过这个解决方案: How to detect if any key is pressed 但仍然没有任何反应。
答案 0 :(得分:1)
还有一些关于这个主题的讨论here。焦点存在一些问题,试试这个:
XAML
<Grid x:Name="myGrid" Width="Auto" Height="Auto" KeyDown="MainGrid_KeyDown" Focusable="True" />
背后的代码
namespace KeyDown
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
myGrid.Focus(); // focus programmatically, better put it in OnLoaded event
}
private void MainGrid_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show("Key pressed");
}
}
}
我的观点是,Grid
可能是空洞的,不是为了拥有焦点,插入其他可以更好地聚焦的控件,并向它们添加KeyDown事件。另请注意KeyDown和PreviewKeyDown之间存在一些差异。
答案 1 :(得分:0)
您需要在主窗口的构造函数中创建一个事件处理程序。 像这样:
MainGrid.KeyDown += new RouteEventHandler(MainGrid_KeyDown);
https://msdn.microsoft.com/en-us/library/ms743596%28v=vs.100%29.aspx
删除事件处理程序中的if(KeysDown()。Any())。看看你从对象发送者和KeyEventArgs e得到的东西。