2011-01-24 51 views
5

Tôi phải viết bàn phím ảo cho chương trình của công ty chúng tôi, phần lớn được sử dụng trên máy tính của ngành có khả năng cảm ứng.Cách viết bàn phím ảo trên màn hình

Chúng tôi không thể sử dụng bàn phím mặc định của cửa sổ vì chúng tôi không cần tất cả các phím trên bàn phím. Vì vậy, tôi đã được yêu cầu viết một tùy chỉnh trong C#.

Tôi đã tìm thấy this blog làm tham chiếu, nhưng tôi không chắc chắn cách bắt đầu.

Tôi đã tạo một giao diện mẫu thử nghiệm nhỏ và gán cho mỗi khóa một scancode và dịch các scancode này thành ký tự liên quan. Và gửi chúng đến kiểm soát hoạt động. Nhưng tôi không chắc chắn những gì scancodes tôi nên sử dụng.

Vì vậy, câu hỏi của tôi là, đó là cách chính xác để viết một OSK như thế này và nếu có scancodes tôi nên sử dụng? Bất kỳ liên kết nào?

Tôi cũng không chắc chắn làm thế nào để xử lý sự thay đổi bang ...

Edit:

Được rồi tôi đã nghiên cứu nhiều hơn một chút và đã đưa ra một osk mà đọc hiện nay bố cục bàn phím và thậm chí xử lý dễ dàng các thay đổi trạng thái (ShiftAlt Gr). Tôi đã viết một lớp KeyButton kế thừa từ Button, điều này KeyButton có thuộc tính ScanCode loại byte và nếu bạn gán một mã vạch hợp lệ cho nó, thì KeyButton sẽ gọi các hàm liên quan để nhận văn bản chính xác. Tôi đã sử dụng các chức năng từ blog của Michael Kaplan với một số thay đổi nhỏ. Cuối cùng hóa ra tôi chỉ phải làm như anh ấy đã làm.

Vì vậy, câu trả lời cho câu hỏi của tôi là: Có, bạn phải sử dụng scancode trên các nút của bạn và sau đó nhận được virtualkey và unicode từ bố trí bàn phím. Use these scancodes.

Bây giờ tôi có được những nhân vật duy nhất còn lại là gửi những thứ này.

+0

là OSK này cho sử dụng chung hoặc cụ thể cho một phần mềm cụ thể? (Tức là bạn sẽ cấp mã quét cho các sự kiện cửa sổ xe buýt hoặc gửi mã số char để một ứng dụng winforms?) Sự khác biệt là rất lớn. –

+0

Đối với phần mềm của chúng tôi, vì vậy tôi muốn gửi mã char vào một hộp văn bản. Nhưng tôi muốn sử dụng bố trí bàn phím như osk mặc định trong cửa sổ. – MBulli

+0

Còn khóa chết thì sao? – Joey

Trả lời

1

Tôi nghĩ điều này khá đơn giản, chỉ cần tạo một chuỗi các nút và gán cho mỗi nút một chữ cái, và bên trong các nút Nhấn phương pháp bạn có thể làm một cách đơn giản.

SendKeys.Send("A"); 

Thay đổi quan trọng dựa trên nút vv

+0

Có, nhưng tôi muốn sử dụng bố cục bàn phím từ cửa sổ. – MBulli

+0

Điều này vẫn hoạt động – kyndigs

1

tôi đã viết các lớp bản đồ mà bản đồ mã khóa nhân vật cho các ứng dụng WPF. Có thể điều này có thể hữu ích.

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

Bạn có thể muốn kiểm tra những kẻ:

http://cnt.lakefolks.com/

Có thể rẻ hơn chỉ để mua nó chứ không phải phát triển nó, ya không bao giờ biết ;-)

Các vấn đề liên quan