2012-03-07 30 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