2013-07-10 49 views
3

在主窗體中我有用於將數據保存在數據庫中的快捷鍵(ctrl + S)。對於組合框(ctrl + Alphabets)是默認的操作。如何禁用Combobox的快捷鍵?如何在C#中使用Windows應用程序禁用ComboBox上的快捷鍵?

UPDATE:

在按鍵事件,我們可以做到這一點

 if (ModifierKeys == Keys.Control) 
     { 
      e.Handled = true; 
     } 
+0

http://social.msdn.microsoft.com/Forums/vstudio/en-US/61600ac7-0ec6-47a6-801e-54d8aea2689e/disable-shortcut-key-f4-into-combobox –

+0

can you explain – Anjali

回答

0

給我的感覺,你的問題其實是,組合框的形式獲得前按鍵。如果要在控件之前處理按鍵,請務必將表單的KeyPreview屬性設置爲true。

有關KeyPreview屬性的更多信息: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview(v=vs.100).aspx

如果您收到類似重寫F4鍵(在組合框顯示默認提供的所有選項)問題,請注意有關設置KeyPressEventArgs.Handled屬性位在窗體的KeyPress事件處理程序中爲true。

2

你可以嘗試重寫主窗體的ProcessCmdKey方法:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    const int WM_KEYDOWN = 0x100; 

    if (keyData == (Keys.Control | Keys.S)) { 
    if (msg.Msg == WM_KEYDOWN) 
     MySaveDataToDatabase(); // <- Do your save command 

    return true; // <- Stop processing the WM_KeyDown message for Ctrl + S (and shortcut as well) 
    } 

    // All other key messages process as usual 
    return base.ProcessCmdKey(ref msg, keyData); 
} 
0

對於大多數熱鍵可以覆蓋PreviewKeyDown事件定義如何允許與否,如:

void comboBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    var keysToIgnore = new []{ 
     Keys.S, 
     Keys.X, 
     Keys.F4, 
     Keys.Space, 
    }.ToList(); 

    if (keysToIgnore.Contains(e.KeyCode)) { 
     if(e.Modifiers == Keys.Alt) ; // Do stuff (or don't) here 
    } 
} 

有所有有多種方式可以根據實際使用情況構建自己的邏輯,但希望您能明白。

您可能會發現一些熱鍵組合不可能以這種方式禁用,在這種情況下,您需要使用Win32API:UnregisterHotKey。這裏更多的信息:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646327%28v=vs.85%29.aspx

使用PreviewKeyDown事件的主要優點是,你還可以輕鬆更換的行爲,而不是僅僅將其禁用。使用UnregisterHotKey的主要優點是它在較低的級別上運行,並且是一種更加健壯和可靠的禁用熱鍵的方式。

編輯:

如果你需要獲得值的連續範圍,你可以嘗試這樣的:

int keyCode = (int) (e.KeyCode); 
if(keyCode >= (int)(Keys.A) && keyCode <= (int)(Keys.Z)) { /* do stuff */ } 

但同樣,一個理想的解決方案實際上取決於你的使用情況的具體細節。沒有通用的「正確答案」。

+1

There在PreviewKeyDown中沒有關鍵屬性 – Anjali

+0

謝謝,已修復它。它應該是'KeyCode'而不是'Key'。 – nathanchere

+0

那麼對於所有字母,你怎麼能做到這一點。 – Anjali

相關問題