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