2013-02-14 19 views
1

我在窗體上有一個button,我想用Alt鍵 + 中號,展現ContextMenuStrip(cmsJournal),不幸的是,當我使用快捷,則按鈕得到了專注,但沒有KeyPress event已被解僱。展會和重點菜單

我想用下面的方法,當我按下Alt鍵+中號

private void PopJournalMenu() { 
     cmsJournal.Show(btnJournal, new System.Drawing.Point(0, 0 - cmsJournal.Height)); 
     tsmiAPPayment.Select(); 
    } 

回答

1

首先第一件事情,我不建議創建快捷方式與Alt鍵。在Windows應用程序中,Alt鍵保留用於鍵盤加速器。這是您看到控件字幕中的某些字母加下劃線的原因。例如,如果您使用標題爲「& Journal」的按鈕控件,它將顯示爲J ̲ ournal,並且您將能夠按下Alt + J以「點擊」該按鈕而不觸摸鼠標,這對於可訪問性原因非常重要。

如果您想保持與此行爲一致,並且您的按鈕更像是一個下拉按鈕(即用鼠標點擊時顯示菜單的按鈕),那麼您的任務非常簡單。如上所示標記按鈕(使用字符串中的&字符表示所需的加速器,在您的情況下爲M),然後連接代碼以顯示下拉菜單,就像您通常在Click事件中那樣處理程序。

如果您想使應用程序混淆且難以使用,並且您沒有下拉按鈕,那麼您將需要手動攔截鍵盤事件並欺騙窗口管理器。不言而喻,這將更加困難。

您需要克服的主要問題是重點。只有聚焦的控件纔會收到鍵盤事件,並且一次只能聚焦一個控件。因此,如果您的表單除了您的按鈕(如文本框)之外還包含多個控件,那麼其他控件中的任何一個都可能具有焦點而不是按鈕。這意味着他們會收到鍵盤事件,並可能以他們自己的方式對它們做出反應。這就是爲什麼KeyPress事件沒有達到你想要的(KeyDownKeyUp事件會有同樣的問題)。這些事件與特定的控制有關,只有當他們所連接的控制器集中時纔會觸發。

如果您想逃避這一點,您需要處理「更高」級別的鍵盤事件。在WinForms中執行此操作的標準方式是覆蓋ProcessCmdKey method,在Form級別。在您重寫的方法中,您將測試所需的鍵盤組合,並在適當的情況下顯示彈出式菜單。例如:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == (Keys.Alt | Keys.M)) 
    { 
     cmsJournal.Show(btnJournal, new Point(0, 0 - cmsJournal.Height)); 
     return true; // indicate that you handled the key event 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

或者,您可以致電您的PopJournalMenu方法。不過,我不確定tsmiAPPayment是什麼或者爲什麼你需要調用它的Select方法。在your previous question中,我得到了您嘗試使用Select確保上下文菜單的重點的印象。你不需要那樣做; Show方法已經爲你處理。

+0

謝謝你的幫助,我不知道有一個下拉按鈕,我會尋找它。在我以前的方法中,我使用tsmiAPPayment.Select()將第一個項目集中在上下文菜單中。 – user1104916 2013-02-15 07:03:45

+0

非常感謝你,我的錯誤在於捕獲KeyPress事件而不是點擊事件。我的問題解決了,我的代碼簡單幹淨,非常感謝你。 – user1104916 2013-02-15 07:38:22