【问题标题】:Picking up keystrokes Ctrl-Alt-Q拾取击键 Ctrl-Alt-Q
【发布时间】:2014-01-13 19:32:43
【问题描述】:

选择按键组合的“正确/最佳”方式是什么?有问题的键是 Ctrl+Alt+Q,我希望用户同时按下它们,此时我要去开一扇窗。我目前正在通过有一个数组然后单独捕获每个击键来做到这一点,但我的结果不一致,尤其是在特定品牌的戴尔笔记本电脑/Windows 7 组合上,但这是另一回事。

所以在用谷歌花了五分钟之后,这只是查看 msdn 后的一个粗略版本,但正如我之前所说,这个版本(未经测试)是正确/最好的方法吗?

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)    
{
    const int WM_KEYDOWN = 0x100;
    const int WM_SYSKEYDOWN = 0x104;

    if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
    {
        switch(keyData)
        {
            case Keys.Control | Keys.Alt | Keys.Q:
            this.Parent.Text="<CTRL> + Alt + Q Captured";
            break;
        }               
    }

    return base.ProcessCmdKey(ref msg,keyData);
}

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    忽略msg.Msg,只看keyData。如果您使用击键,则在不调用 base 的情况下返回 true。这将其简化为:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)    
    {
        if (keyData == (Keys.Control | Keys.Alt | Keys.Q)) {
            this.Parent.Text="<CTRL> + Alt + Q Captured";
            return true;
        }
        return base.ProcessCmdKey(ref msg,keyData);
    }
    

    这可能应该是对 form 的 方法的覆盖,因此您不必依赖于具有焦点的控件。你可以改用 this.Text。

    【讨论】:

    • 哦,是的,它在表单上,​​而不是控件上。
    【解决方案2】:

    是的,如果我希望全局监听关键事件,我会这样做。

    但如果您仅在程序是焦点窗口(在 Windows 的前面)时对键盘输入感兴趣,您可能需要使用 KeyDown 事件:

    private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {
     // your code goes here
    }
    

    【讨论】:

      【解决方案3】:

      根据 System.Windows.Forms.Keys 的文档,您不能使用按位 OR 来检查组合键。文档指出:“要进行更精细的控制,请使用在 user32.dll 中定义的 Win32 API 函数 GetKeyState、GetAsyncKeyState 或 GetKeyboardState ...”。但似乎 Shift、Alt 和 Control 可以用作按位标志。

      【讨论】:

      • 不,您引用了 Keys.ControlKey 和 Keys.Menu 的值。 Keys.Control 和 Keys.Alt 的值非常不同(0x20000、0x40000)。它们是位标志。您的回答是无缘无故地将用户送入 pinvoke 兔子洞。
      • 谢谢汉斯,你帮我节省了一些时间 :)
      【解决方案4】:

      对于那些想要在@Hans Passant 的灯光下通过三个键(带有两个修饰符)的组合打开窗户或使其可见/不可见的人,我终于找到了我的问题的答案。我提防了|操作数,而不是 && 操作数不起作用。它可以分配给 WFA 属性到 Keydown

      private void ShowHidden_Click(object sender, KeyEventArgs e)
          {
              if (e.KeyData == (Keys.Control | Keys.Alt | Keys.M) )
              {
                  OldBisProdId.Visible = true;
                  OldGanProdId.Visible = true;
              }
              if (e.KeyData == (Keys.Control | Keys.Alt | Keys.C))
              {
                  OldBisProdId.Visible = false;
                  OldGanProdId.Visible = false;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2021-10-20
        • 2018-06-30
        • 1970-01-01
        • 2014-09-12
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        • 2014-01-13
        相关资源
        最近更新 更多