2012-03-07 75 views
1

根据MSDN上的this page,Left Control的Key Value是162.我怎样才能确定这个键是否在代码中被按下?目前,每次我尝试处理按键时,我都会得到值17,这只是一个通用控制键。有没有办法区分两者?我试过重写ProcessCmdKey和处理文本框的PreviewKeyDown,但它们都返回17而不是162。我需要对所有修改键执行此操作,并且在结束对值的硬编码之前,是否有更好的替代方法来在代码中捕获这些值?捕获特定的修饰键

编辑:添加代码。为了澄清,我想检索162号码,而不是找到区分修饰符的另一种方法。

private void PortfolioNameTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    var val = e.KeyValue; //17 when control is pressed and not 162 

} 

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    //msg.Wparam = 17 
    return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

你能否提供你正在使用捕捉按键(我假设你想捕捉它的代码从你的表格而不是全球)? – 2012-03-07 04:29:33

+0

我已经添加了代码,是的,只是表单。 – XSL 2012-03-07 04:43:06

+0

在WinForms中,我认为你运气不好。您只能处理传递给您的应用程序的键码。潜在的解决方法是设置全局密钥钩子并检查当前应用程序是否属于您自己的。 – 2012-03-07 04:49:45

回答

2

Messr Passant answered这很多个月前。

将是很好,如果KeyEventArgs包括它,但尽管如此,就可以实现这样的:

[DllImport("user32.dll")] 
    private static extern short GetAsyncKeyState(Keys key); 

    private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     Console.WriteLine("Ctrl:{0}, LCtrl:{1}, RCtrl:{2}", 
     GetAsyncKeyState(Keys.ControlKey) < 0, 
     GetAsyncKeyState(Keys.LControlKey) < 0, 
     GetAsyncKeyState(Keys.RControlKey) < 0); 
    } 
+0

啊,只是读你的评论...你可以用蛮力使用这种方法来获得你的魔法162。例如,如果(GetAsyncKeyState(Keys.LControlKey)<0)返回(int)Keys.LControlKey,但不是理想的 – 2012-03-07 05:11:19