2011-01-24 26 views
5

lokalize. Biz klavyedeki tüm tuşları gerekmez çünkünasıl yazılır bir çoğunlukla dokunmatik özelliğine sahip endüstrinin PC'lerde kullanılan şirketimizin programı için ekran klavyesinde bir yazmak zorunda üzerine ekran-klavye

Biz pencere varsayılan klavyeyi kullanamazsınız. Bu yüzden C# 'da özel bir tane yazmam istendi.

Zaten referans olarak this blog bulundu, ancak nasıl başlayacağımı bilmiyorum.

Ben küçük prototip GUI oluşturulan ve her anahtar bir scancode için atamak ve ilgili karaktere bu scancodes çevirir. Ve onları aktif kontrole gönderin. Ama hangi tarama kodlarını kullanmam gerektiğinden emin değilim.

Benim soru, doğru yolu böyle bir OSK yazma ve evet hangi eğer scancodes kullandığım gerektiğidir edilir? Herhangi bir bağlantı var mı?

ben ... Ayrıca sahip kaydırma durumlarını nasıl işleneceğini emin değilim

Düzenleme: Biraz daha araştırma yaptım ve akımı okuyan bir termektedirler ile geldi

Tamam klavye düzeni ve hatta kolay kaydırma durumlarını (ÜstKrktr ve Alt Gr) işler. Button'dan gelen KeyButton sınıfını yazdım, bu KeyButton, ScanCode tip bayt özelliğine sahip ve geçerli bir tarama kodu atarsanız, KeyButton doğru metni almak için ilgili işlevleri çağırır. Michael Kaplan bloglarından bazı küçük değişikliklerle fonksiyonları kullandım. Sonunda, onun yaptığı gibi yapmak zorunda olduğum ortaya çıktı.

Sorunun yanıtı şöyledir: Evet, düğmelerinizde tarama kodlarını kullanmanız ve ardından sanal klavye ve unicode'u klavye düzeninden almanız gerekir. Use these scancodes.

Şimdi tek şey sol karakterler etrafında bu göndermektir olsun.

+0

belli olmaz, sadece satın ziyade geliştirmek ucuza olabilirdi

http://cnt.lakefolks.com/

için bu OSK mi Genel kullanım veya belirli bir yazılım için özel olarak? (Yani, tarama kodlarını Windows olay veri yoluna mı besleyecek veya bir kod form uygulamasına char kodları gönderecek misin?) Fark büyüktür. –

+0

Yazılımımız için, bir metin kutusuna char kodları göndermek istiyorum. Ama klavye düzenini pencerelerde varsayılan osk gibi kullanmak istiyorum. – MBulli

+0

Ölü anahtarlar ne durumda? – Joey

cevap

1

Bunun oldukça basit olduğunu düşünüyorum, sadece bir dizi düğme oluşturun ve her düğmeye bir harf atayın ve düğmelerin içinde Basit bir yöntem yapabilirsiniz. düğme vb dayanan

SendKeys.Send("A"); 

değiştirme tuşu

+0

Evet, ancak klavye düzenini pencerelerden kullanmak istiyorum. – MBulli

+0

Bu hala çalışır – kyndigs

1

WPF uygulaması için karakterine anahtar kodunu map haritalama sınıfları yazdı. Bu yardımcı olabilir.

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

Bu adamları kontrol etmek isteyebilirsiniz: ya ;-)