ويندوز - كيفية التقاط الحرف '#' على لوحات مفاتيح مختلفة في WPF/C#؟



لوحة مفاتيح الكمبيوتر عربي انجليزي (1)

تطبيق WPF الخاص بي يعالج مكابس لوحة المفاتيح وبالتحديد الرمز # و * كما هو هاتف VoIP.

لدي خلل على الرغم من لوحات المفاتيح الدولية ، وعلى وجه الخصوص لوحة المفاتيح الإنجليزية البريطانية. عادة ما أستمع إلى المفتاح 3 وإذا كان معدّل مفتاح shift معطلاً ، فإننا نوقف حدثًا للقيام بالأشياء. لكن على لوحة المفاتيح البريطانية هذه هي الحرف "£". لقد وجدت أن لوحة المفاتيح الإنجليزية في المملكة المتحدة تحتوي على مفتاح مخصص لـ "#". من الواضح أننا استطعنا فقط الاستماع لهذا المفتاح الخاص ، لكن هذا لا يحل حالة اللغة الإنجليزية الأمريكية التي هي shift-3 وجميع لوحات المفاتيح الأخرى التي لا تحصى والتي تضعها في مكان آخر.

قصة قصيرة طويلة ، كيف يمكنني الاستماع إلى شخصية معينة من خلال الضغط على مفتاح ، سواء كان ذلك بمثابة مفتاح رئيسي أو مفتاح واحد والرد عليه؟


الدالة أدناه ، GetCharFromKey (مفتاح مفتاح) ستفعل الخدعة.

ويستخدم سلسلة من المكالمات win32 لفك ضغط المفتاح:

  1. الحصول على المفتاح الافتراضي من مفتاح WPF

  2. الحصول على رمز المسح الضوئي من المفتاح الظاهري

  3. الحصول على طابع يونيكود الخاص بك

هذا المنصب القديم يصفه بتفاصيل أكثر بعض الشيء.

      public enum MapType : uint
      {
         MAPVK_VK_TO_VSC = 0x0,
         MAPVK_VSC_TO_VK = 0x1,
         MAPVK_VK_TO_CHAR = 0x2,
         MAPVK_VSC_TO_VK_EX = 0x3,
      }

      [DllImport("user32.dll")]
      public static extern int ToUnicode(
          uint wVirtKey,
          uint wScanCode,
          byte[] lpKeyState,
          [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)] 
            StringBuilder pwszBuff,
          int cchBuff,
          uint wFlags);

      [DllImport("user32.dll")]
      public static extern bool GetKeyboardState(byte[] lpKeyState);

      [DllImport("user32.dll")]
      public static extern uint MapVirtualKey(uint uCode, MapType uMapType);

      public static char GetCharFromKey(Key key)
      {
         char ch = ' ';

         int virtualKey = KeyInterop.VirtualKeyFromKey(key);
         byte[] keyboardState = new byte[256];
         GetKeyboardState(keyboardState);

         uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC);
         StringBuilder stringBuilder = new StringBuilder(2);

         int result = ToUnicode((uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0);
         switch (result)
         {
            case -1: 
               break;
            case 0: 
               break;
            case 1:
               {
                  ch = stringBuilder[0];
                  break;
               }
            default:
               {
                  ch = stringBuilder[0];
                  break;
               }
         }
         return ch;
      }




keypress