2013-01-13 30 views
0

當打開ContextMenuStrip時,如果用戶鍵入可能選擇的第一個字母 - 就好像他點擊了它。我想攔截並獲取他點擊的角色。獲取用戶鍵入的字符,當ContextMenuStrip有焦點時

以下代碼可以做到這一點,但可以對可能的字符進行硬編碼。我想要一個通用的方法來做到這一點,要麼通過關鍵筆劃禁用自動選擇(只留下鼠標點擊)或某種方式來攔截字符。

下面的簡化代碼假設我想讓winform的Text爲鍵入的字符,並且ContextMenuStrip有一個選項是「A」。

public Form1() 
{ 
    InitializeComponent(); 
    contextMenuStrip1.KeyDown += contextMenuStrip1_KeyDown; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    contextMenuStrip1.Show(); 
} 

void contextMenuStrip1_KeyDown(object sender, KeyEventArgs e) 
{ 
    e.SuppressKeyPress = true; 
    if (e.KeyCode == Keys.A) 
    { 
     if (e.Shift) Text = "A"; 
     else Text = "a"; 
    } 
} 

使用KeyPress事件和檢查e.KeyChar不起作用,因爲它不會被解僱。 (以下簡稱「」點擊事件被解僱,而不是)。

使用其中之一:e.KeyCodee.KeyData,或e.KeyValue不工作(沒有進一步的硬編碼),因爲他們接受一個Shift作爲重點。

+0

你只想攔截A-Z嗎?你想要在該範圍之外發現什麼? – thudbutt

+2

您應該從ContextMenuStrip派生自己的類並重寫ProcessMnemonic()方法。 –

+0

@HansPassant謝謝。您可以將您的評論轉換爲答案。這是答案。 – ispiro

回答

3

如註釋中所述,您必須從ContextMenuStrip派生自己的類,以便可以重寫ProcessMnemonic()方法。

註釋了這一點,鍵盤處理在Winforms中非常複雜。在將焦點分派到控件之前,快捷鍵擊很早被處理。通常情況下,您不希望爲每個控件實現KeyDown事件,以便可以使快捷鍵操作起作用。

這從外面工作,涉及到幾個受保護的方法,ProcessCmdKey,ProcessDialogChar和ProcessMnemonic。以及OnKeyDown(如果窗體的KeyPreview屬性被設置),一個VB6兼容功能。所以表單首先得到一個鏡頭,然後從那裏迭代控件,從容器到子控件。

ToolStrip類(ContextMenuStrip的基類)重寫ProcessMnemonic()方法以識別按鍵,並將它們映射到菜單項。所以爲了攔截這個默認處理,你必須自己重寫ProcessMnemonic()以便首先在按鍵處獲得一個鏡頭。

+0

謝謝。非常感謝你的幫助。 – ispiro

相關問題