C# Keydown事件如何使用热键收听

C# Keydown事件如何使用热键收听,c#,wpf,C#,Wpf,我已将ctrl+`注册为热键,我想在按下热键时显示一个窗口,而不是释放leftctrl键和toggle`键来执行其他操作,就像alt+tab切换应用程序一样。下面是代码 private void ListOnKeyDown(object sender, KeyEventArgs e) { if (e.SystemKey==Key.LeftCtrl && e.Key == Key.Oem3) { m_host.SelectNext(); }

我已将ctrl+`注册为热键,我想在按下热键时显示一个窗口,而不是释放leftctrl键和toggle`键来执行其他操作,就像alt+tab切换应用程序一样。下面是代码

private void ListOnKeyDown(object sender, KeyEventArgs e)
{
    if (e.SystemKey==Key.LeftCtrl && e.Key == Key.Oem3)
    {
        m_host.SelectNext();
    }
}
但我发现这种方式只触发了一个键。那么,触发键事件的正确方式是什么呢

下面是调试信息。

只需更改keydown事件即可通过这种方式检测修改器

private void ListOnKeyDown(object sender, KeyEventArgs e)
{
    if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.Oem3)
    {
        m_host.SelectNext();
        e.Handled = true;
    }      
}

因为onKeyDown事件只适用于一个键,为了同时使用两个键,您几乎不需要临时修改:

bool firstkeyisOn = false;
private void ListOnKeyDown(object sender, KeyEventArgs e)
{
    if (e.SystemKey==Key.LeftCtrl/*Or other key by choice*/)
    {
        firstkeyisOn = true;
        e.Handled = true;
        return;
    }
    if(firstkeyisOn  && (e.Key == Key.Oem3/*Or other key by choice*/))
    {
        m_host.SelectNext();
    }
}

private void ListOnKeyUp(object sender, KeyEventArgs e)
{
    if (e.SystemKey==Key.LeftCtrl/*Key must be same as holding one*/)
    {
        firstkeyisOn = false;
    }
    //or
    //firstkeyisOn = false;
}

要取消热键模式,只需在OnKeyUp事件下添加firstkeyisOn=false,您就可以开始了。

当您说“热键”时,您的意思是当您当前在windows中未处于活动状态时,它也应该被触发,例如“全局热键”?是,热键是一个全局热键。它显示并激活一个窗口。您可以看到e.SystemKey为None。但我怀疑检查SystemKey None是否会触发事件,因为未单击任何键?一个键未释放,但键状态应为keydown?查找我的更新代码,刚在测试应用程序上检查过,效果很好。这是一项糟糕的技术。Ctrl是一个修改键。也许它可以工作,但我想知道如何使用按键事件。键盘。修改器也没有。你确定是因为在调试时,我将修改器作为控件使用吗?是的,因为热键触发后ctrl键总是按下,我想这与此有关。如果同时按下这两个键,怎么可能