2010-11-05 16 views
0

我有一個鉤子進入keydown事件的實現,它抑制了按鍵事件,並做了一些魔術。現在我想展示一些比「ControlKey」更友好的東西,所以你可以在下面的代碼中看到一個開關。除了我已經意識到諸如D1D2等頂端的數字鍵之類的東西,然後就會出現像numpad +這樣的Add之類的東西。另外,打印屏幕似乎不被識別。有沒有任何C#實現或方法有一個文本框,將鍵序列作爲輸入?

有什麼我失蹤了嗎?

這對我來說很難描述,但希望你明白我的意思。如果不是,我想我會回覆評論,並在我去的時候改進。

private int numKeys = 0; 
private List<int> shortcutKeys = new List<int>(); 

private void textBoxRegionKeys_Click(object sender, EventArgs e) 
{ 
    textBoxRegionKeys.SelectAll(); 
} 

private void textBoxRegionKeys_KeyDown(object sender, KeyEventArgs e) 
{ 
    // There are certain keys we want to ignore... 
    if (e.KeyCode != Keys.Delete && e.KeyCode != Keys.Back) 
    { 
     // We can handle this ourselves, thanks 
     e.SuppressKeyPress = true; 

     // Shortern what we show 
     string ret = e.KeyCode.ToString(); 
     switch (ret) 
     { 
      case "ControlKey": ret = "Ctrl"; break; 
      case "ShiftKey": ret = "Shift"; break; 
      case "Menu": ret = "Alt"; break; 
     } 

     // If we haven't selected anything, we should be appending 
     if (textBoxRegionKeys.SelectionLength == 0) 
     { 
      if (numKeys > 0) 
      { 
       // Does our key already exist in the list? 
       if (shortcutKeys.Exists(x => x == e.KeyValue)) 
       { 
        return; 
       } 

       textBoxRegionKeys.Text += " + "; 
      } 
      textBoxRegionKeys.Text += ret; 
      shortcutKeys.Add(e.KeyValue); 
      numKeys++; 
     } 
     else 
     { 
      textBoxRegionKeys.Text = ret; 
      shortcutKeys.Clear(); 
      shortcutKeys.Add(e.KeyValue); 
      numKeys = 1; 
     } 
    } 
} 

回答

1

文本框的KeyDown /按鍵響應等將僅被升高,選擇那些在文本框(和相關聯的改性劑)被接受作爲輸入的密鑰。因此,你不會看到處理,如打印屏幕等,我能想到的最好的辦法是不理想的鑰匙,但是你可以重寫ProcessKeyPreview或一些其他形式的級別消息攔截器得到通知的任何按鍵的。喜歡的東西...

protected override bool ProcessKeyPreview(ref Message m) 
{ 
    var keyCode = (Keys)Enum.ToObject(typeof (Keys), m.WParam); 

    //Insert some logic 

    return base.ProcessKeyPreview(ref m); 
} 

當然,這種方法將被調用時的形式有重點,有鍵按下,所以你就必須做某種形式的檢查過濾下來(這又是不理想)

if(ReferenceEquals(ActiveControl, textBoxRegionKeys)) {} 

如果你處理像UserControls這樣的事情將會非常不可靠。

至於在尼斯友好的信息格式,我想你基本上你需要自己的特殊字符地圖...我不知道對於任何按鍵全球化查找。我會挖一點,更新的答案,如果我找到的東西。

編輯

做了一個小挖,但沒有找到任何明顯的漂亮鍵映射。我只是想創建地圖的「友好」鍵名稱的:

private static readonly Dictionary<Keys, String> KeysMap = new Dictionary<Keys, String> 
                  { 
                   { Keys.D1, "1"}, 
                   { Keys.D9, "9"} 
                  }; 

而且做這樣的事情:

String friendlyKeyCode; 
    if (!KeysMap.TryGetValue(keyCode, out friendlyKeyCode)) 
    friendlyKeyCode = keyCode.ToString(); 

就個人而言,我發現這種方法比一個巨大的開關更好......但也工作。

相關問題