2013-03-12 62 views
10

有沒有什麼辦法將WPF的KeyEventArgs.Key轉換爲CharKeyEventArgs.Key to char

我試圖用KeyInterop

var x = (Char)KeyInterop.VirtualKeyFromKey(e.Key); 

數字和它工作正常的信件,但對於其他字符沒有。 例如對於OemComma它返回'1/4'而不是','。

我需要它來防止用戶輸入除TextBox以外的任何字符,除了數字和分隔符(即逗號或句點)。

+0

http://stackoverflow.com/questions/5825820/how-to - 如何將字符轉換爲等價的System.Windows.Input.Key枚舉值?](http:// stackoverflow) - 可能的重複字符不同的區域設置鍵盤在wpf-c – Alex 2013-03-12 11:02:24

+0

.com/questions/544141/how-to-convert-a-character-in-to-equivalent-system-windows-input-key-enum-value) – 2013-03-12 11:04:04

+1

試試'KeyConverter.ConvertToString'而不是 – Rachel 2013-03-12 12:50:56

回答

1

爲什麼這樣的做法?有阻止用戶執行此類輸入的不同方法。例如,爲TextBox.TextChanged -event定義事件處理程序,並在輸入不是小數或分隔符時,撤消輸入。

private void textChangedEventHandler(object sender, TextChangedEventArgs args){ 
//args contains a property `Changes` where you can see what happened 
//check for invalid characters and revoke them 
} 

請參閱TextChangedEventArgsevent

+3

我用[ PreviewTextInput(HTTP://毫秒dn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SYSTEM.WINDOWS.UIELEMENT.PREVIEWTEXTINPUT);k(VS.XAMLEDITOR);k(SOLUTIONITEMSPROJECT);k(TargetFrameworkMoniker-%22。NETFRAMEWORK%2cVERSION%3dV4.0%22)&RD =真)。不過謝謝。 – 2013-03-13 06:33:23

4

發現這個地方,我忘記了。仍然使用它,不知道它有什麼漏洞,但據我所知,它的工作。

public static class KeyEventUtility 
{ 
    // ReSharper disable InconsistentNaming 
    public enum MapType : uint 
    { 
     MAPVK_VK_TO_VSC = 0x0, 
     MAPVK_VSC_TO_VK = 0x1, 
     MAPVK_VK_TO_CHAR = 0x2, 
     MAPVK_VSC_TO_VK_EX = 0x3, 
    } 
    // ReSharper restore InconsistentNaming 

    [DllImport("user32.dll")] 
    public static extern int ToUnicode(
     uint wVirtKey, 
     uint wScanCode, 
     byte[] lpKeyState, 
     [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)] 
     StringBuilder pwszBuff, 
     int cchBuff, 
     uint wFlags); 

    [DllImport("user32.dll")] 
    public static extern bool GetKeyboardState(byte[] lpKeyState); 

    [DllImport("user32.dll")] 
    public static extern uint MapVirtualKey(uint uCode, MapType uMapType); 

    public static char GetCharFromKey(Key key) 
    { 
     char ch = ' '; 

     int virtualKey = KeyInterop.VirtualKeyFromKey(key); 
     var keyboardState = new byte[256]; 
     GetKeyboardState(keyboardState); 

     uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC); 
     var stringBuilder = new StringBuilder(2); 

     int result = ToUnicode((uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0); 
     switch (result) 
     { 
     case -1: 
      break; 
     case 0: 
      break; 
     case 1: 
      { 
       ch = stringBuilder[0]; 
       break; 
      } 
     default: 
      { 
       ch = stringBuilder[0]; 
       break; 
      } 
     } 
     return ch; 
    } 
} 
+0

對於此代碼中的錯誤,請參閱此處的註釋:http://stackoverflow.com/a/5826175/187650 – juFo 2016-11-15 11:30:56

0

我的第一個建議是使用PreviewTextInput和使用TextCompositionEventArgs。 然而這'吃'空間字符。 對於這種「space'發出看:

另一個解決方案是使用KeyConverterKEYUP事件:

KeyConverter kc = new KeyConverter(); 
    var str = kc.ConvertToString(e.Key); 

對於WPFhttps://msdn.microsoft.com/en-us/library/system.windows.input.keyconverter(v=vs.110).aspx 對於的WinFormshttps://msdn.microsoft.com/en-us/library/system.windows.forms.keysconverter.aspx

注意KeyConverter會給你字符串 「空間」,而不是 「」。 (同樣按下ESC鍵時爲 「ESC」

另一個WPF溶液在KEYUP事件中使用這樣的:

((char)KeyInterop.VirtualKeyFromKey(e.Key))