2011-01-24 16 views
5

Tengo que escribir un teclado en pantalla para el programa de nuestra compañía, que se usa principalmente en computadoras de la industria con capacidad táctil.Cómo escribir un teclado en pantalla localizado

No podemos usar el teclado predeterminado de Windows porque no necesitamos todas las teclas del teclado. Entonces me pidieron que escribiera uno personalizado en C#.

Ya encontré this blog como referencia, pero no estoy seguro de cómo empezar.

Creé una pequeña GUI prototipo y asigné para cada clave un scancode, y traduje estos códigos de exploración al personaje relacionado. Y enviarlos al control activo. Pero no estoy seguro de qué códigos de exploración debería usar.

Entonces mi pregunta es, ¿es esa la forma correcta de escribir un OSK como este y, en caso afirmativo, qué códigos de exploración debo usar? Cualquier enlace?

Tampoco estoy seguro de cómo manejar el cambio estados ...

Editar:

bien lo hice un poco más investigación y se acercó con un osk que lee la corriente diseño del teclado e incluso maneja los cambios fáciles estados (Shift y Alt Gr). Escribí una clase KeyButton que hereda de Button, esta KeyButton tiene una propiedad ScanCode de tipo byte y si le asigna un código de exploración válido, el KeyButton llamará a las funciones relacionadas para obtener el texto correcto. Usé las funciones de los blogs de Michael Kaplan con algunos pequeños cambios. Al final resultó que solo tenía que hacer lo mismo que él.

Así que la respuesta a mi pregunta es: Sí, debe usar códigos de exploración en sus botones y luego obtener la clave virtual y el Unicode del diseño del teclado. Use these scancodes.

Ahora consigo los personajes, lo único que queda es enviarlos.

+0

¿Es esta OSK para uso genérico o específicamente para un software dado? (Es decir, ¿alimentará los códigos de escaneo al bus de eventos de Windows o enviará códigos de char a una aplicación de winforms?) La diferencia es enorme. –

+0

Para nuestro software, entonces quiero enviar códigos de char a un cuadro de texto. Pero quiero usar el diseño del teclado como el osk predeterminado en Windows. – MBulli

+0

¿Qué pasa con las llaves muertas? – Joey

Respuesta

1

Creo que esto es bastante simple, solo haga una serie de botones y asigne a cada botón una letra, y dentro de los botones haga clic en el método que puede hacer de forma simple.

SendKeys.Send("A"); 

clave cambiante basado en el botón etc

+0

Sí, pero quiero usar el diseño del teclado desde Windows. – MBulli

+0

Esto todavía funcionaría – kyndigs

1

me escribió clases de mapeo que mapean código clave del carácter de aplicación de WPF. Puede ser que esto pueda ayudar.

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); 
} 
0

Es posible que desee echa un vistazo a estos chicos:

http://cnt.lakefolks.com/

podría ser más barato sólo para comprarlo en lugar de desarrollarlo, ya nunca se sabe ;-)

Cuestiones relacionadas