2008-10-10 57 views
12

我想創建一個組件,允許我們使用與Visual Studio IDE和Microsoft Office等任意命令相關聯的複合鍵盤快捷鍵。如何在Windows窗體應用程序中創建複合鍵盤快捷鍵?

即,由多個鍵擊序列的鍵盤快捷鍵,如Ctrl鍵+W¯¯ + Ç。在Visual Studio中,這將打開類視圖。當按下第一組鍵時(Ctrl + W)消息「(Ctrl + W)被按下。等待和絃的第二個鍵......」出現在狀態欄中。

+0

鍵盤快捷鍵和絃是一個多鍵快捷鍵。像Ctrl + W,C,它打開了類視圖。當按下第一組鍵時(CTRL + W),按下「(CTRL + W)」消息,等待第二個和絃鍵......出現在狀態條上。我想重現這一點。 – JJS 2008-10-10 17:55:22

+0

我發現了WPF的一個實現。 http://insystusa.com/Products.aspx – JJS 2010-11-09 17:43:54

回答

11

在回答的鍵盤和絃具體而言,我不相信這個問題有在這一點上提供給你一個現成的選擇。

但是,它應該足夠簡單來建模。我會創建一個類,也許是KeyboardChordProvider。它需要了解表單級別的鍵盤事件。如別處所述,Form.KeyPreview財產必須是true。此提供商可能已訂閱Form.KeyPress事件就足夠了。如果你在表單中傳遞,你可以在提供者的構造函數中完成所有這些。

您需要向提供者註冊潛在的擊鍵。

該實例在內部將跟蹤當前狀態。每當觀察到表示和絃的第一個鍵的擊鍵時,您就會更新提供者的狀態並引發一個事件,以便用戶可以設置文本:(CTRL + W)被按下。等待和絃的第二把鑰匙...

如果下一次擊鍵匹配潛在的次要選項,那麼你有一個匹配,並可能引發一個包含輸入筆劃細節的事件ChordPressed。或者,您可以調用在註冊和絃時提供給提供者的特定回調函數(以避免在ChordPressed事件處理函數中存在switch語句或其他派生函數)。

如果在任何時候按鍵不匹配下一個選項,那麼您將重置提供程序的狀態。

在提供程序的內部,您可以使用樹結構對可能的擊鍵進行建模。提供者的當前狀態只是一個特定的樹節點。在開始時,根節點將是活動的。如果一個孩子匹配一個擊鍵,那麼它就會成爲當前節點,以預期下一個擊球。如果孩子是一個葉節點,那麼整個和絃已經匹配,並且您會引發事件(傳遞讓您到達該點的筆劃鏈)或調用存儲在葉中的回調。每當沒有按鍵匹配一個孩子時,重置回使根節點處於活動狀態。

我覺得這樣的設計會達到你想要的。

0

使用窗體的OnKeyPressed事件,並檢查所需的組合鍵是在EventArgs的參數按下

1

菜單控件具有屬性命名ShortCut在那裏你可以分配一個值。當你按下該快捷鍵時,該菜單項將被調用。將該屬性用於具有相應菜單的命令。

如果您需要菜單上不可用的快捷方式,那麼您必須通過表單或控件上的KeyUpKeyDown事件來處理您的自己。一個KeyEventArgs對象將被傳遞給您的處理程序,您可以檢查哪個鍵被按下,以及Ctrl,Alt或Shift鍵是否也被按下。從MSDN

示例代碼:

// Handle the KeyDown event to determine the type of character entered into the control. 
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    // Initialize the flag to false. 
    nonNumberEntered = false; 

    // Determine whether the keystroke is a number from the top of the keyboard. 
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9) 
    { 
     // Determine whether the keystroke is a number from the keypad. 
     if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9) 
     { 
      // Determine whether the keystroke is a backspace. 
      if(e.KeyCode != Keys.Back) 
      { 
       // A non-numerical keystroke was pressed. 
       // Set the flag to true and evaluate in KeyPress event. 
       nonNumberEntered = true; 
      } 
     } 
    } 
    //If shift key was pressed, it's not a number. 
    if (Control.ModifierKeys == Keys.Shift) { 
     nonNumberEntered = true; 
    } 
} 
0

除了一些答案,使用一個按鈕或菜單項的標題的符號,將導致它被強調,並訪問使用Alt +您在前面加上&符號&的字母。

換句話說,如果你有一個菜單項標題&文件將與下F和用戶的下劃線顯示可以通過點擊Alt鍵 + ˚F觸發菜單。

0

這取決於鍵盤快捷鍵的範圍。如果你想從窗體上的任何控件使用的鍵盤快捷鍵,而無需使用工具欄,在表格上設置

Form.KeyPreview = true; 

。這將允許所有按鍵事件通過在一個位置處處理單個鍵盤快捷方式而不是在所有用戶控件中複製功能的表單級別的事件來進行過濾,所述按鍵事件被表格級別的事件過濾。

MSDN: Form.KeyPreview Property