回答
的邀請碼是你在的KeyDown和KEYUP事件得到。由於這是一個轉移的字符,它取決於鍵盤佈局。據我所知,大多數鍵盤都在數字2之上,這意味着需要e.Shift && e.KeyCode == Keys.D2
(WinForms)。但在
一些
大多數國際鍵盤,這是行不通的。
但是請注意,處理按鍵響應事件是更可靠:e.KeyChar == '@'
編輯:我剛剛看了一下在this page,最國際化的鍵盤有"
在2
鍵,使用Alt-東西得到一個@
。
在我的鍵盤是Keys.D2因爲@是同一個鍵位2
但是,如果你處理你在有KeyPressEventArgs.KeyChar property參數KeyPressEventArgs KeyPress事件。此屬性包含一個字符而不是鍵碼。
您不應該使用KeyDown事件來識別類似@的鍵。從虛擬鍵碼(KeyEventArgs.KeyData)到鍵入鍵的轉換取決於鍵盤佈局。英國和美國的情況可能有所不同,你有一英鎊可以擠在某個地方。在遠東地區的鍵盤上肯定會有所不同。
改爲使用KeyPressed事件。
首先你需要一個類來包裝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函數,所以在其他平臺上需要另一種方法。
- 1. Javascript關鍵代碼=/= char代碼
- 2. CTRL + [char]的鍵碼是什麼?
- 3. 如何找到在javascript中的char的鍵碼值
- 4. char數組的輸入鍵代碼是什麼?
- 5. 用於Char代碼的Javascript事件按鍵檢查
- 6. 是否可以通過Lwuit中的關鍵代碼獲取char?
- 7. 解碼JPEG爲char *
- 8. char []或StringBuilder的密碼?
- 9. 大號碼,輸入的char []
- 10. 使用char *作爲std :: map中的鍵
- 11. 功能鍵的Java char表示法?
- 12. Char *作爲地圖中的鍵C++
- 13. Yii的使用char主鍵和點
- 14. char []代碼中的返回類型不接受char [i] []值
- 15. 如何修復字典<char, char>的編碼?
- 16. 非常簡單的代碼無效地從'char'轉換爲'char *'?
- 17. char *在託管代碼中?
- 18. Java代碼Char和Int
- 19. C fread char代碼塊
- 20. Char編碼在node.js ChildProcess.fork()
- 21. 如何加減char *號碼?
- 22. MySQL用戶表char密碼
- 23. PHP char編碼,#== 0,0 == NULL,#!= NULL
- 24. char!=(signed char),char!=(unsigned char)
- 25. 從android的鍵碼到java的鍵碼
- 26. 什麼是'char'關鍵字用於?
- 27. 如何從字典<char,Tuple <int, char>>特定鍵的int值?
- 28. char,char [],char *之間的區別*
- 29. 用於密碼安全的CHAR和VARCHAR
- 30. 如何得到給定char的ASCII碼?
沒有工作。抱歉。 說s 2不是@ – iTEgg 2009-12-19 18:56:42
我的意思是keys.D2沒有工作。現在嘗試下一個。 – iTEgg 2009-12-19 18:58:07
嗯,我想你可以做MessageBox.Show(keycode.ToString())並找到它是什麼。 – 2009-12-19 19:13:24