- 對于鍵盤事件PreviewKeyDown、PreviewKeyUp、KeyDown、KeyUp,在其中檢查當(dāng)次事件是哪個(gè)按鍵觸發(fā)的很簡單,只需要判斷KeyEventArgs類型的事件參數(shù)e的Key屬性。
- 如果需要判斷修飾鍵(Alt、Ctrl、Shift)是否同時(shí)被按下,以Window.KeyDown事件為例,有兩種寫法:
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.H)
{
//同時(shí)按下了Ctrl + H鍵(H要最后按,因?yàn)榕袛嗔舜舜问录膃.Key)
//修飾鍵只能按下Ctrl,如果還同時(shí)按下了其他修飾鍵,則不會(huì)進(jìn)入
}
}
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Control) && e.Key == Key.H)
{
//同時(shí)按下了Ctrl + H鍵(H要最后按,因?yàn)榕袛嗔舜舜问录膃.Key)
//修飾鍵只要按下了Ctrl,不管按沒按其他修飾鍵,都會(huì)進(jìn)入
}
}
其中的e.KeyboardDevice.Modifiers,可以用Keyboard.Modifiers(Keyboard類的靜態(tài)屬性)來替換。
另外,也可以利用Keyboard類的靜態(tài)方法IsKeyDown,完全脫離事件參數(shù)e,來監(jiān)聽判斷鍵盤按鍵(推薦) :
if (Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.H) && Keyboard.IsKeyDown(Key.C))
{
//只要當(dāng)下同時(shí)按下的鍵中包含LeftCtrl、H和C,就會(huì)進(jìn)入
}
這種方式可以在任何時(shí)刻,檢測多個(gè)組合按鍵(不一定是修飾鍵),并且對按鍵順序和最后按的是哪個(gè)鍵沒有要求。
但是,以上方法有使用前提,都只在當(dāng)前窗體獲得焦點(diǎn)時(shí)有效。
如果焦點(diǎn)在別的窗體上,或者用戶切換到別的應(yīng)用程序時(shí),則只好利用C#的平臺(tái)調(diào)用功能,調(diào)用操作系統(tǒng)底層的dll,來進(jìn)行監(jiān)聽了。
原文出處