2010-01-04 101 views
3

我試圖完成類似於here的其他工作,但是隨着答案的出現,我留下了一點問題,但這並不是什麼大問題,但醜陋的用戶POV:C#(VS2008)抑制修改鍵的鍵碼,但保留修飾符

當它將按鍵數據放入文本框中時,如果用戶在該字符之前按下修飾鍵(就像這樣),文本框將被填充,包括修飾符的鍵名。也就是說,我得到的結果是「CTRL + SHIFT + ShiftKey」。我試圖做的任何事情都是爲了抑制最後一個密鑰碼,最終也會抑制真正的密鑰。如果沒有我要求的抑制,這是我的基礎嘗試(原諒阻塞,我一直在分解它,並重寫它的一些部分,試圖在我自己的工作,無濟於事)。

String pressed =""; 
e.SuppressKeyPress = true; 
if ((e.Modifiers & Keys.Control) > 0) 
{ 
    pressed += "CTRL + "; 
} 
if ((e.Modifiers & Keys.Alt) > 0) 
{ 
    pressed += "ALT + "; 
} 
if ((e.Modifiers & Keys.Shift) > 0) 
{ 
    pressed += "SHIFT + "; 
} 


    pressed += e.KeyCode; 


    txtCopyKey.Text = pressed; 

希望我在這裏明白我在問什麼。

+4

您可能會擺脫它,但* *嚴格,你應該使用'= 0'這裏,不是'> 0',就好像MSB被設置一樣,它將顯示爲負數。 – 2010-01-04 12:44:44

+0

你說得對。我修復了它。謝謝。 – GeminiDomino 2010-01-04 13:12:30

回答

3

這個怎麼樣的解決方案:

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    StringBuilder sb = new StringBuilder(); 

    if (e.Control) 
    { 
     sb.Append(Keys.Control.ToString()); 
     sb.Append(" + "); 
    } 

    if (e.Alt) 
    { 
     sb.Append(Keys.Alt.ToString()); 
     sb.Append(" + "); 
    } 

    if (e.Shift) 
    { 
     sb.Append(Keys.Shift.ToString()); 
     sb.Append(" + "); 
    } 

    if (e.KeyCode != Keys.ShiftKey 
     && e.KeyCode != Keys.ControlKey 
     && e.KeyCode != Keys.Menu) 
    { 
     sb.Append(e.KeyCode.ToString()); 
    } 

    textBox1.Text = sb.ToString(); 
} 
+0

這確實發生在我身上,我想確保我不會錯過更優雅的方式來做到這一點。測試它很快,謝謝。 – GeminiDomino 2010-01-04 15:29:07

+0

*優雅的方式*看看http://stackoverflow.com/questions/921180/c-round-up/926806#926806 – Oliver 2010-01-05 08:16:34

1

你可以刪除的修正標誌:

pressed += (e.KeyCode & ~Keys.Modifiers & ~Keys.ShiftKey & ~Keys.ControlKey); 
+0

不幸的是,這似乎並沒有阻止它返回修飾鍵本身。謝謝,不過。 – GeminiDomino 2010-01-04 13:14:11

+0

你有沒有改變它?現在,這種方法可以正確處理修飾符唯一的關鍵情況,但最終按下字符鍵時(即Ctrl-X導致「CTRL + H」而Ctrl-C導致「CTRL + 64「 – GeminiDomino 2010-01-04 17:16:57

+0

不,我沒有改變任何東西... – 2010-01-04 17:45:20