如何在WPFC#中的不同区域设置键盘上捕获“#”字符?

如何在WPFC#中的不同区域设置键盘上捕获“#”字符?,第1张

如何在WPF / C#中的不同区域设置键盘上捕获“#”字符

下面的函数GetCharFromKey(Key key)可以解决问题。

它使用一系列win32调用来解码按下的键:

  1. 从WPF密钥获取虚拟密钥

  2. 从虚拟密钥获取扫描代码

  3. 得到你的Unipre字符

这篇旧文章对此进行了更详细的描述。

      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,      }      [Dllimport("user32.dll")]      public static extern int ToUnipre(          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);         byte[] keyboardState = new byte[256];         GetKeyboardState(keyboardState);         uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC);         StringBuilder stringBuilder = new StringBuilder(2);         int result = ToUnipre((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;      }


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5113678.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-17
下一篇2022-11-17

发表评论

登录后才能评论

评论列表(0条)

    保存