我必须为我们公司的程序编写一个屏幕键盘,这个程序主要用于具有触摸function的工业PC上。
我们不能使用Windows的默认键盘,因为我们不需要键盘上的所有键。 所以我被要求用C#编写一个自定义的。
我已经find这个博客作为参考,但我不知道如何开始。
我创build了一个小的原型GUI,并为每个键分配一个扫描码,并将这些扫描码转换为相关的字符。 并发送给主动控制。 但是我不确定我应该使用什么样的扫描码。
在Windows下获取实际的屏幕dpi / ppi
如何在屏幕窗口中终止由bash文件运行的所有任务?
是否有可能从-L标志命名'屏幕'日志文件?
如何打开/切换到Linux中的第10个屏幕会话?
如何在屏幕会话中configuration默认TERM?
所以我的问题是,写这样一个OSK的正确方法,如果是我应该使用哪个扫描码? 任何链接?
我也不知道如何处理转换状态…
编辑:
好吧,我做了更多的研究,并提出了一个osk,它读取当前的键盘布局,甚至处理简单的转换状态( Shift和Alt Gr )。 我写了一个从Buttoninheritance的KeyButton类,这个KeyButton有一个types为byte的KeyButton属性,如果给它分配一个有效的扫描码, KeyButton将调用相关的函数来获取正确的文本。 我使用了来自Michael Kaplan博客的function,并做了一些小改动。 最后事实certificate,我必须像他一样做同样的事情。
所以我的问题的答案是:是的,你必须在你的button上使用扫描码,然后从键盘布局获得虚拟键和unicode。 使用这些扫描码。
现在我得到的人物唯一剩下的就是发送这些。
等同于Linux的“屏幕”
什么屏幕尺寸更好的最终用户
使用Windows Media编码器录制屏幕
我觉得这很简单,只需制作一系列按钮并为每个按钮分配一个字母,并在按钮内部单击即可做一个简单的方法。
SendKeys.Send("A");
基于按钮更换按键等
我写了映射类,将关键代码映射到WPF应用程序的字符。 可能是这可以帮助。
public class KeyMapper { /// <summary> /// Map key code to character. /// If key code cannot be mapped returns empty char. /// </summary> public static char MapKey(Key key,bool shiftpressed,string culture) { CheckCulture(culture); int englishVirtuaCode = KeyInterop.VirtualKeyFromKey(key); return EnglishVirtualCodetochar(englishVirtuaCode,shiftpressed,culture); } private static void CheckCulture(string culture) { InputLanguage language = InputLanguage.FromCulture(new CultureInfo(culture)); if (language == null) throw new ArgumentException(string.Format("culture {0} does not exist.",culture)); } private static char EnglishVirtualCodetochar(int enlishVirtualCode,string culture) { var scanCode = KeyMappingWinApi.MapVirtualKeyEx((uint)enlishVirtualCode,EnglishCultureHandle); var vitualKeyCode = KeyMappingWinApi.MapVirtualKeyEx(scanCode,1,GetCultureHandle(culture)); byte[] keyStates = GetKeyStates(vitualKeyCode,shiftpressed); const int key@R_1000_4045@ionSize = 5; var stringBuilder = new StringBuilder(key@R_1000_4045@ionSize); KeyMappingWinApi.ToUnicodeEx(vitualKeyCode,scanCode,keyStates,stringBuilder,stringBuilder.Capacity,GetCultureHandle(culture)); if (stringBuilder.Length == 0) return ' '; return stringBuilder[0]; } private static IntPtr EnglishCultureHandle { get { return GetCultureHandle("en-US"); } } private static IntPtr GetCultureHandle(string culture) { return InputLanguage.FromCulture(new CultureInfo(culture)).Handle; } /// <summary> /// Gets key states for ToUnicodeEx function /// </summary> private static byte[] GetKeyStates(uint keyCode,bool shiftpressed) { const byte keyPressFlag = 0x80; const byte shifPosition = 16; // position of Shift key in keys array var keyStatses = new byte[256]; keyStatses[keyCode] = keyPressFlag; keyStatses[shifPosition] = shiftpressed ? keyPressFlag : (byte)0; return keyStatses; } } public class KeyMappingWinApi { [DllImport("user32.dll")] public static extern uint MapVirtualKeyEx(uint uCode,uint uMapType,IntPtr dwhkl); [DllImport("user32.dll")] public static extern int ToUnicodeEx(uint wVirtKey,uint wScanCode,byte[] lpKeyState,[Out,MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff,int cchBuff,uint wFlags,IntPtr dwhkl); [DllImport("user32.dll")] public static extern short VkKeyScanEx(char ch,IntPtr dwhkl); }
你可能想看看这些家伙:
http://cnt.lakefolks.com/
可能会更便宜,而不是开发它,你永远不会知道;-)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。