2017-07-21 47 views
1

我開發了Windows窗體應用程序(.NET 4.6,VS.2017),我有兩種形式,主窗體和非模態窗體。在這兩種形式中,我需要趕上用戶按下F2鍵這是順便說一下應用程序使用的唯一功能鍵,沒有爲其他功能鍵定義的其他快捷鍵。沒有菜單項衝突的窗體級捕獲功能鍵

在這兩種表格中我都使用了Form.KeyPreview,默認情況下它是false。然後,我還實施了KeyDown事件,並在其中我檢查它是否是我的功能鍵:

private void myView_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.F2) // breakpoint placed here! 
    { 
     // perform action 
     e.Handled = true; 
    } 
} 

做那我已經放在哪個鍵被按下,而不是內部的IF語句檢查斷點通知行動塊

現在在我的非模態窗體中,無論選擇哪個功能鍵,它都能正常工作。

但是,主表單顯示出相同代碼的怪異行爲。如果在主窗體中使用'e.KeyCode == Keys.F3',則斷點會觸發按下除F3以外的所有其他功能鍵。

因此,我然後改變if語句,而不是檢查F2而不是F3。但是現在隨着這種改變,斷點觸發除F2以外的所有功能鍵,所以F3之前不工作(檢查F3時)現在可以工作,但F2不工作。

無論我選擇哪個功能鍵,斷點都會觸發所有功能鍵,除了我選擇的功能鍵。

雖然...在我的一個ToolStripMenuItems中,我還將相同的功能鍵作爲快捷鍵,因爲它們執行相同的操作(然後用戶不必按Alt G,然後按Alt鍵,而是改爲使用F2直接

所以,如果我從ToolStripMenuItem中刪除快捷方式,然後我的表單KeyDown按預期工作,但沒有視覺提示給用戶,他可以使用F2來完成該功能。此外,無論是tooltripmenuitem還是形式都不會對所選功能鍵起作用。

然後,我可以做些什麼來使快捷鍵適用於工具條菜單項和形成水平?

+0

除了斷點被擊中與否之外,還有什麼問題?編譯優化可能會導致您正在觀察的內容,除非存在實際問題,否則我不會擔心。 –

+0

問題是我想擁有tooltrip菜單項以及鍵盤輸入的快捷鍵,因爲在這兩種情況下F2都應該執行一項功能。但它似乎無法處理這兩種類型 –

+0

爲什麼使用KeyDown事件和KeyPreview?設置快捷鍵似乎達到了你想要的行爲。 –

回答

0

經過測試將MenuStripITem的ShortcutKeys屬性設置爲'F2'後,我能夠獲得您提到的行爲。點擊菜單項或點擊F2都執行按鈕的處理程序代碼。我沒有更改KeyPreview屬性,也沒有實現KeyDown。我認爲擺脫這些不必要的代碼會幫助你。