2009-12-19 19 views
1

有人能告訴我@鍵的標識嗎?@ char的鍵碼

例如keys.Escape是ESC鍵。我想知道它是什麼@

謝謝。

回答

5

邀請碼是你在的KeyDownKEYUP事件得到。由於這是一個轉移的字符,它取決於鍵盤佈局。據我所知,大多數鍵盤都在數字2之上,這意味着需要e.Shift && e.KeyCode == Keys.D2(WinForms)。但在 一些 大多數國際鍵盤,這是行不通的。

但是請注意,處理按鍵響應事件是更可靠:e.KeyChar == '@'

編輯:我剛剛看了一下在this page,最國際化的鍵盤有"2鍵,使用Alt-東西得到一個@

2

在我的鍵盤是Keys.D2因爲@是同一個鍵位2

但是,如果你處理你在有KeyPressEventArgs.KeyChar property參數KeyPressEventArgs KeyPress事件。此屬性包含一個字符而不是鍵碼。

+0

沒有工作。抱歉。 說s 2不是@ – iTEgg 2009-12-19 18:56:42

+0

我的意思是keys.D2沒有工作。現在嘗試下一個。 – iTEgg 2009-12-19 18:58:07

+0

嗯,我想你可以做MessageBox.Show(keycode.ToString())並找到它是什麼。 – 2009-12-19 19:13:24

2

您不應該使用KeyDown事件來識別類似@的鍵。從虛擬鍵碼(KeyEventArgs.KeyData)到鍵入鍵的轉換取決於鍵盤佈局。英國和美國的情況可能有所不同,你有一英鎊可以擠在某個地方。在遠東地區的鍵盤上肯定會有所不同。

改爲使用KeyPressed事件。

0

首先你需要一個類來包裝OS調用必要的檢查鍵盤佈局:

public class KeyboardPointer : IDisposable 
{ 
    [DllImport("user32.dll", CharSet = CharSet.Unicode)] 
    static extern short VkKeyScanEx(char ch, IntPtr dwhkl); 
    [DllImport("user32.dll")] 
    static extern bool UnloadKeyboardLayout(IntPtr hkl); 
    [DllImport("user32.dll")] 
    static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags); 
    private readonly IntPtr pointer; 
    public KeyboardPointer(int klid) 
    { 
    pointer = LoadKeyboardLayout(klid.ToString("X8"), 1); 
    } 
    public KeyboardPointer(CultureInfo culture) 
    :this(culture.KeyboardLayoutId){} 
    public void Dispose() 
    { 
    UnloadKeyboardLayout(pointer); 
    GC.SuppressFinalize(this); 
    } 
    ~KeyboardPointer() 
    { 
    UnloadKeyboardLayout(pointer); 
    } 
    public bool GetKey(char character, out Keys key) 
    { 
    short keyNumber = VkKeyScanEx(character, pointer); 
    if(keyNumber == -1) 
    { 
     key = Keys.None; 
     return false; 
    } 
    key = (System.Windows.Forms.Keys)(((keyNumber & 0xFF00) << 8) | (keyNumber & 0xFF)); 
    return true; 
    } 
} 

然後,如果你運行:

Keys atKey; 
bool hasAtKey; 
using(var keyboard = new KeyboardPointer(CultureInfo.CurrentCulture)) 
    hasAtKey = keyboard.GetKey('@', out atKey); 

hasAtKey將是真實的,如果鍵盤上有一鍵組合爲@,在這種情況下atKey將保持相應的值,否則將保存Keys.None

例如,當我運行它時,atKey包含的值爲Keys.Oemtilde | Keys.Shift,但如果我更改要通過的代碼CultureInfo.GetCultureInfo("en-US")它包含Keys.D2 | Keys.Shift

正如你可以看到,KeyboardPointer被寫入同時接受的培養和一個數字ID,所以你並不限於主鍵盤的培養,而且與它一起使用的其他佈局,如Dvorak佈局等

以上都是使用調用Windows的User32函數,所以在其他平臺上需要另一種方法。