由於@EdPlunkett建議,this answer作品對我來說:
[DllImport("user32.dll")]
static extern bool GetKeyboardState(byte[] lpKeyState);
[DllImport("user32.dll")]
static extern uint MapVirtualKey(uint uCode, uint uMapType);
[DllImport("user32.dll")]
static extern IntPtr GetKeyboardLayout(uint idThread);
[DllImport("user32.dll")]
static extern int ToUnicodeEx(uint wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl);
public static string KeyCodeToUnicode(System.Windows.Forms.Keys key)
{
byte[] keyboardState = new byte[255];
bool keyboardStateStatus = GetKeyboardState(keyboardState);
if (!keyboardStateStatus)
{
return "";
}
uint virtualKeyCode = (uint)key;
uint scanCode = MapVirtualKey(virtualKeyCode, 0);
IntPtr inputLocaleIdentifier = GetKeyboardLayout(0);
StringBuilder result = new StringBuilder();
ToUnicodeEx(virtualKeyCode, scanCode, keyboardState, result, (int)5, (uint)0, inputLocaleIdentifier);
return result.ToString();
}
的'KeyPress'事件(我認爲[是WM_CHAR](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646276(V = vs.85)的.aspx ))使用'KeyPressEventArgs',它具有您正在查找的'KeyChar'屬性。如果該事件能夠滿足您的需求,您可以使用它。 –
@EdPununkett說什麼。 'KeyDown'和'KeyEventArgs'只給你虛擬鍵碼,而不是真正的字符(它們經常在值中重合,所以演員的作品就是這樣:巧合)。生成單引號的鍵的虛擬鍵代碼因佈局而異。問題不在於'KeyCode'; 'KeyValue'也不通用。 –
@EdPlunkett這樣做,但我需要禁止按鍵,這隻能在'KeyDown'事件中實現。 – Pipe