繁体   English   中英

如何编写本地化的屏幕键盘

[英]How to write an localized on-screen-keyboard

我必须为我们公司的程序编写一个屏幕键盘,该程序主要用于具有触摸功能的工业PC。

我们无法使用Windows默认键盘,因为我们不需要键盘上的所有键。 所以我被要求用C#写一个自定义的。

我已经发现这个博客作为参考,但我不知道如何开始。

我创建了一个小型原型GUI,为每个键分配一个扫描码,并将这些扫描码转换为相关的字符。 并将它们发送到主动控件。 但我不确定我应该使用哪种扫描码。

所以我的问题是,这是编写像这样的OSK的正确方法,如果是,我应该使用哪些扫描码? 有链接吗?

我也不确定如何处理换档状态......

编辑:

好的,我做了一些研究,想出了一个osk,它读取当前的键盘布局,甚至可以处理简单的移位状态( ShiftAlt Gr )。 我写了一个KeyButton从继承类的Button ,这KeyButton有一个ScanCode型字节的属性,如果你指定一个有效的扫描码到它时, KeyButton将调用相关功能,以获得正确的文本。 我使用Michael Kaplan博客的功能进行了一些小改动。 最后我发现我必须像他一样做。

所以我的问题的答案是:是的,您必须在按钮上使用扫描码,然后从键盘布局中获取虚拟键和unicode。 使用这些扫描码。

现在我得到的角色唯一剩下的就是发送它们。

我认为这很简单,只需制作一系列按钮并为每个按钮分配一个字母,并在按钮内单击方法就可以做到简单。

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, bool shiftPressed, string culture)
    {
        var scanCode = KeyMappingWinApi.MapVirtualKeyEx((uint)enlishVirtualCode, 0, EnglishCultureHandle);
        var vitualKeyCode = KeyMappingWinApi.MapVirtualKeyEx(scanCode, 1, GetCultureHandle(culture));
        byte[] keyStates = GetKeyStates(vitualKeyCode, shiftPressed);
        const int keyInformationSize = 5;
        var stringBuilder = new StringBuilder(keyInformationSize);
        KeyMappingWinApi.ToUnicodeEx(vitualKeyCode, scanCode, keyStates, stringBuilder, stringBuilder.Capacity, 0, 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/

购买它而不是开发它可能更便宜,你永远不会知道;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM