无论如何.
我正在处理键盘输入,并将其转换为字符串.一切都很好.我得到了Shift和CapsLock键的状态并且EXOR它,所以我可以找出结果字符串的大小写.
bool shift = KeyDown(SHIFT_KEY)bool capslock = KeyToggled(CAPSLOCK)bool stringCasing = shift ^ capslock //if both are true/false,the string will be lowercase. Otherwise uppercase.foreach Key k in [List of keys passed as parameter] char c = (char)k if stringCasing c = Char.toupper(c) else c = Char.Tolower(c)end foreach
现在没有问题.如果用户在按住shift键或切换大写字母时键入“a”,则它变为“A”.
但是,如果用户决定键入“!”,即“1”加上shift,我只得到1,因为“1”大写仍为“1”.
在问这个问题之前我在网上看了一下,但我得到的只是“自己映射键”.这真的是唯一的答案吗?而且,如果我映射键然后使用不同键盘布局的用户试图使用我的应用程序会发生什么?
提前致谢.
与ToAscii一起,您可能需要引用VkKeyScan
以将密钥转换为virtual key code.此密钥代码用作ToAscii的参数.这些方法的简单P / Invoke声明如下:
[Dllimport("user32.dll")] static extern short VkKeyScan(char c); [Dllimport("user32.dll",SetLastError=true)] static extern int ToAscii( uint uVirtKey,uint uScanCode,byte[] lpKeyState,out uint lpChar,uint flags );
注意ToAscii的第三个参数是一个256元素的数组,它引用每个键的状态;值0x80(高位设置)表示密钥已设置.设置元素0x10(Shift的虚拟键代码)模拟按下Shift.
然后我们可以定义一个辅助方法,该方法将表示键的字符作为参数,并在Shift按下时输出该键:
public static char GetModifIEdKey(char c){ short vkKeyScanResult = VkKeyScan(c); // a result of -1 indicates no key translates to input character if (vkKeyScanResult == -1) throw new ArgumentException("No key mapPing for " + c); // vkKeyScanResult & 0xff is the base key,without any modifIErs uint code = (uint)vkKeyScanResult & 0xff; // set shift key pressed byte[] b = new byte[256]; b[0x10] = 0x80; uint r; // return value of 1 expected (1 character copIEd to r) if (1 != ToAscii(code,code,b,out r,0)) throw new ApplicationException("Could not translate modifIEd state"); return (char)r;}
调用此方法将返回与输入字符的Shift基本键相关联的字符(其中基本键是按下以输入字符的物理键,例如,1是!的基本键).例如,对于美国键盘,GetModifIEdKey(‘7’)和GetModifIEdKey(‘&’)都将返回’&’.返回值将使用加载的键盘布局;例如,在德语键盘上(Shift 7为/),该方法将返回/.
总结以上是内存溢出为你收集整理的c# – 如何获得通过举行班次获得的字符?全部内容,希望文章能够帮你解决c# – 如何获得通过举行班次获得的字符?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)