键输入未注册

时间:2016-04-02 07:07:11

标签: c# wpf

我试图在按下按键时发生某些事情,但我的键盘似乎没有注册。 我试图用任何关键而不是具体的事情来发生事情。

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 但仍然没有任何反应。

2 个答案:

答案 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事件。另请注意KeyDownPreviewKeyDown之间存在一些差异。

答案 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得到的东西。