点击按键Ctrl-Alt-Q

时间:2011-11-06 19:01:30

标签: c# winforms

选择按键组合的“正确/最佳”方式是什么?有问题的键是 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);
}

4 个答案:

答案 0 :(得分:6)

忽略msg.Msg,只查看keyData。如果使用击键,则返回true而不调用base。这简化为:

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);
}

这可能是对表单的方法的重写,因此您不依赖于具有焦点的控件。你会改用this.Text。

答案 1 :(得分:1)

是的,如果我想听一下全球的关键事件,我就会这样做。

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

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

答案 2 :(得分:1)

根据System.Windows.Forms.Keys的文档,您不能使用按位OR来检查组合键。该文档指出:“为了更好地控制,请使用在user32.dll中定义的Win32 API函数GetKeyState,GetAsyncKeyState或GetKeyboardState ......”。但看起来Shift,Alt和Control可以用作按位标志。

答案 3 :(得分:0)

对于那些想要打开窗户或通过@Hans Passant的光线使用三个键(带两个修饰符)的组合使其可见/不可见的人,我终于找到了我的问题的答案。我当心|操作数,改为&amp;&amp;操作数不起作用。它可以分配给Wyd属性到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;
        }
    }