text: #include "stdafx.h"
  
  const WCHAR cp1252[256] = {
    /*0x00*/  0x0000,  //Null
    /*0x01*/  0x0001,  //Start Of Heading
    /*0x02*/  0x0002,  //Start Of Text
    /*0x03*/  0x0003,  //End Of Text
    /*0x04*/  0x0004,  //End Of Transmission
    /*0x05*/  0x0005,  //Enquiry
    /*0x06*/  0x0006,  //Acknowledge
    /*0x07*/  0x0007,  //Bell
    /*0x08*/  0x0008,  //Backspace
    /*0x09*/  0x0009,  //Horizontal Tabulation
    /*0x0a*/  0x000a,  //Line Feed
    /*0x0b*/  0x000b,  //Vertical Tabulation
    /*0x0c*/  0x000c,  //Form Feed
    /*0x0d*/  0x000d,  //Carriage Return
    /*0x0e*/  0x000e,  //Shift Out
    /*0x0f*/  0x000f,  //Shift In
    /*0x10*/  0x0010,  //Data Link Escape
    /*0x11*/  0x0011,  //Device Control One
    /*0x12*/  0x0012,  //Device Control Two
    /*0x13*/  0x0013,  //Device Control Three
    /*0x14*/  0x0014,  //Device Control Four
    /*0x15*/  0x0015,  //Negative Acknowledge
    /*0x16*/  0x0016,  //Synchronous Idle
    /*0x17*/  0x0017,  //End Of Transmission Block
    /*0x18*/  0x0018,  //Cancel
    /*0x19*/  0x0019,  //End Of Medium
    /*0x1a*/  0x001a,  //Substitute
    /*0x1b*/  0x001b,  //Escape
    /*0x1c*/  0x001c,  //File Separator
    /*0x1d*/  0x001d,  //Group Separator
    /*0x1e*/  0x001e,  //Record Separator
    /*0x1f*/  0x001f,  //Unit Separator
    /*0x20*/  0x0020,  //Space
    /*0x21*/  0x0021,  //Exclamation Mark
    /*0x22*/  0x0022,  //Quotation Mark
    /*0x23*/  0x0023,  //Number Sign
    /*0x24*/  0x0024,  //Dollar Sign
    /*0x25*/  0x0025,  //Percent Sign
    /*0x26*/  0x0026,  //Ampersand
    /*0x27*/  0x0027,  //Apostrophe
    /*0x28*/  0x0028,  //Left Parenthesis
    /*0x29*/  0x0029,  //Right Parenthesis
    /*0x2a*/  0x002a,  //Asterisk
    /*0x2b*/  0x002b,  //Plus Sign
    /*0x2c*/  0x002c,  //Comma
    /*0x2d*/  0x002d,  //Hyphen-Minus
    /*0x2e*/  0x002e,  //Full Stop
    /*0x2f*/  0x002f,  //Solidus
    /*0x30*/  0x0030,  //Digit Zero
    /*0x31*/  0x0031,  //Digit One
    /*0x32*/  0x0032,  //Digit Two
    /*0x33*/  0x0033,  //Digit Three
    /*0x34*/  0x0034,  //Digit Four
    /*0x35*/  0x0035,  //Digit Five
    /*0x36*/  0x0036,  //Digit Six
    /*0x37*/  0x0037,  //Digit Seven
    /*0x38*/  0x0038,  //Digit Eight
    /*0x39*/  0x0039,  //Digit Nine
    /*0x3a*/  0x003a,  //Colon
    /*0x3b*/  0x003b,  //Semicolon
    /*0x3c*/  0x003c,  //Less-Than Sign
    /*0x3d*/  0x003d,  //Equals Sign
    /*0x3e*/  0x003e,  //Greater-Than Sign
    /*0x3f*/  0x003f,  //Question Mark
    /*0x40*/  0x0040,  //Commercial At
    /*0x41*/  0x0041,  //Latin Capital Letter A
    /*0x42*/  0x0042,  //Latin Capital Letter B
    /*0x43*/  0x0043,  //Latin Capital Letter C
    /*0x44*/  0x0044,  //Latin Capital Letter D
    /*0x45*/  0x0045,  //Latin Capital Letter E
    /*0x46*/  0x0046,  //Latin Capital Letter F
    /*0x47*/  0x0047,  //Latin Capital Letter G
    /*0x48*/  0x0048,  //Latin Capital Letter H
    /*0x49*/  0x0049,  //Latin Capital Letter I
    /*0x4a*/  0x004a,  //Latin Capital Letter J
    /*0x4b*/  0x004b,  //Latin Capital Letter K
    /*0x4c*/  0x004c,  //Latin Capital Letter L
    /*0x4d*/  0x004d,  //Latin Capital Letter M
    /*0x4e*/  0x004e,  //Latin Capital Letter N
    /*0x4f*/  0x004f,  //Latin Capital Letter O
    /*0x50*/  0x0050,  //Latin Capital Letter P
    /*0x51*/  0x0051,  //Latin Capital Letter Q
    /*0x52*/  0x0052,  //Latin Capital Letter R
    /*0x53*/  0x0053,  //Latin Capital Letter S
    /*0x54*/  0x0054,  //Latin Capital Letter T
    /*0x55*/  0x0055,  //Latin Capital Letter U
    /*0x56*/  0x0056,  //Latin Capital Letter V
    /*0x57*/  0x0057,  //Latin Capital Letter W
    /*0x58*/  0x0058,  //Latin Capital Letter X
    /*0x59*/  0x0059,  //Latin Capital Letter Y
    /*0x5a*/  0x005a,  //Latin Capital Letter Z
    /*0x5b*/  0x005b,  //Left Square Bracket
    /*0x5c*/  0x005c,  //Reverse Solidus
    /*0x5d*/  0x005d,  //Right Square Bracket
    /*0x5e*/  0x005e,  //Circumflex Accent
    /*0x5f*/  0x005f,  //Low Line
    /*0x60*/  0x0060,  //Grave Accent
    /*0x61*/  0x0061,  //Latin Small Letter A
    /*0x62*/  0x0062,  //Latin Small Letter B
    /*0x63*/  0x0063,  //Latin Small Letter C
    /*0x64*/  0x0064,  //Latin Small Letter D
    /*0x65*/  0x0065,  //Latin Small Letter E
    /*0x66*/  0x0066,  //Latin Small Letter F
    /*0x67*/  0x0067,  //Latin Small Letter G
    /*0x68*/  0x0068,  //Latin Small Letter H
    /*0x69*/  0x0069,  //Latin Small Letter I
    /*0x6a*/  0x006a,  //Latin Small Letter J
    /*0x6b*/  0x006b,  //Latin Small Letter K
    /*0x6c*/  0x006c,  //Latin Small Letter L
    /*0x6d*/  0x006d,  //Latin Small Letter M
    /*0x6e*/  0x006e,  //Latin Small Letter N
    /*0x6f*/  0x006f,  //Latin Small Letter O
    /*0x70*/  0x0070,  //Latin Small Letter P
    /*0x71*/  0x0071,  //Latin Small Letter Q
    /*0x72*/  0x0072,  //Latin Small Letter R
    /*0x73*/  0x0073,  //Latin Small Letter S
    /*0x74*/  0x0074,  //Latin Small Letter T
    /*0x75*/  0x0075,  //Latin Small Letter U
    /*0x76*/  0x0076,  //Latin Small Letter V
    /*0x77*/  0x0077,  //Latin Small Letter W
    /*0x78*/  0x0078,  //Latin Small Letter X
    /*0x79*/  0x0079,  //Latin Small Letter Y
    /*0x7a*/  0x007a,  //Latin Small Letter Z
    /*0x7b*/  0x007b,  //Left Curly Bracket
    /*0x7c*/  0x007c,  //Vertical Line
    /*0x7d*/  0x007d,  //Right Curly Bracket
    /*0x7e*/  0x007e,  //Tilde
    /*0x7f*/  0x007f,  //Delete
    /*0x80*/  0x20ac,  //Euro Sign
    /*0x81*/  0x0081,
    /*0x82*/  0x201a,  //Single Low-9 Quotation Mark
    /*0x83*/  0x0192,  //Latin Small Letter F With Hook
    /*0x84*/  0x201e,  //Double Low-9 Quotation Mark
    /*0x85*/  0x2026,  //Horizontal Ellipsis
    /*0x86*/  0x2020,  //Dagger
    /*0x87*/  0x2021,  //Double Dagger
    /*0x88*/  0x02c6,  //Modifier Letter Circumflex Accent
    /*0x89*/  0x2030,  //Per Mille Sign
    /*0x8a*/  0x0160,  //Latin Capital Letter S With Caron
    /*0x8b*/  0x2039,  //Single Left-Pointing Angle Quotation Mark
    /*0x8c*/  0x0152,  //Latin Capital Ligature Oe
    /*0x8d*/  0x008d,
    /*0x8e*/  0x017d,  //Latin Capital Letter Z With Caron
    /*0x8f*/  0x008f,
    /*0x90*/  0x0090,
    /*0x91*/  0x2018,  //Left Single Quotation Mark
    /*0x92*/  0x2019,  //Right Single Quotation Mark
    /*0x93*/  0x201c,  //Left Double Quotation Mark
    /*0x94*/  0x201d,  //Right Double Quotation Mark
    /*0x95*/  0x2022,  //Bullet
    /*0x96*/  0x2013,  //En Dash
    /*0x97*/  0x2014,  //Em Dash
    /*0x98*/  0x02dc,  //Small Tilde
    /*0x99*/  0x2122,  //Trade Mark Sign
    /*0x9a*/  0x0161,  //Latin Small Letter S With Caron
    /*0x9b*/  0x203a,  //Single Right-Pointing Angle Quotation Mark
    /*0x9c*/  0x0153,  //Latin Small Ligature Oe
    /*0x9d*/  0x009d,
    /*0x9e*/  0x017e,  //Latin Small Letter Z With Caron
    /*0x9f*/  0x0178,  //Latin Capital Letter Y With Diaeresis
    /*0xa0*/  0x00a0,  //No-Break Space
    /*0xa1*/  0x00a1,  //Inverted Exclamation Mark
    /*0xa2*/  0x00a2,  //Cent Sign
    /*0xa3*/  0x00a3,  //Pound Sign
    /*0xa4*/  0x00a4,  //Currency Sign
    /*0xa5*/  0x00a5,  //Yen Sign
    /*0xa6*/  0x00a6,  //Broken Bar
    /*0xa7*/  0x00a7,  //Section Sign
    /*0xa8*/  0x00a8,  //Diaeresis
    /*0xa9*/  0x00a9,  //Copyright Sign
    /*0xaa*/  0x00aa,  //Feminine Ordinal Indicator
    /*0xab*/  0x00ab,  //Left-Pointing Double Angle Quotation Mark
    /*0xac*/  0x00ac,  //Not Sign
    /*0xad*/  0x00ad,  //Soft Hyphen
    /*0xae*/  0x00ae,  //Registered Sign
    /*0xaf*/  0x00af,  //Macron
    /*0xb0*/  0x00b0,  //Degree Sign
    /*0xb1*/  0x00b1,  //Plus-Minus Sign
    /*0xb2*/  0x00b2,  //Superscript Two
    /*0xb3*/  0x00b3,  //Superscript Three
    /*0xb4*/  0x00b4,  //Acute Accent
    /*0xb5*/  0x00b5,  //Micro Sign
    /*0xb6*/  0x00b6,  //Pilcrow Sign
    /*0xb7*/  0x00b7,  //Middle Dot
    /*0xb8*/  0x00b8,  //Cedilla
    /*0xb9*/  0x00b9,  //Superscript One
    /*0xba*/  0x00ba,  //Masculine Ordinal Indicator
    /*0xbb*/  0x00bb,  //Right-Pointing Double Angle Quotation Mark
    /*0xbc*/  0x00bc,  //Vulgar Fraction One Quarter
    /*0xbd*/  0x00bd,  //Vulgar Fraction One Half
    /*0xbe*/  0x00be,  //Vulgar Fraction Three Quarters
    /*0xbf*/  0x00bf,  //Inverted Question Mark
    /*0xc0*/  0x00c0,  //Latin Capital Letter A With Grave
    /*0xc1*/  0x00c1,  //Latin Capital Letter A With Acute
    /*0xc2*/  0x00c2,  //Latin Capital Letter A With Circumflex
    /*0xc3*/  0x00c3,  //Latin Capital Letter A With Tilde
    /*0xc4*/  0x00c4,  //Latin Capital Letter A With Diaeresis
    /*0xc5*/  0x00c5,  //Latin Capital Letter A With Ring Above
    /*0xc6*/  0x00c6,  //Latin Capital Ligature Ae
    /*0xc7*/  0x00c7,  //Latin Capital Letter C With Cedilla
    /*0xc8*/  0x00c8,  //Latin Capital Letter E With Grave
    /*0xc9*/  0x00c9,  //Latin Capital Letter E With Acute
    /*0xca*/  0x00ca,  //Latin Capital Letter E With Circumflex
    /*0xcb*/  0x00cb,  //Latin Capital Letter E With Diaeresis
    /*0xcc*/  0x00cc,  //Latin Capital Letter I With Grave
    /*0xcd*/  0x00cd,  //Latin Capital Letter I With Acute
    /*0xce*/  0x00ce,  //Latin Capital Letter I With Circumflex
    /*0xcf*/  0x00cf,  //Latin Capital Letter I With Diaeresis
    /*0xd0*/  0x00d0,  //Latin Capital Letter Eth
    /*0xd1*/  0x00d1,  //Latin Capital Letter N With Tilde
    /*0xd2*/  0x00d2,  //Latin Capital Letter O With Grave
    /*0xd3*/  0x00d3,  //Latin Capital Letter O With Acute
    /*0xd4*/  0x00d4,  //Latin Capital Letter O With Circumflex
    /*0xd5*/  0x00d5,  //Latin Capital Letter O With Tilde
    /*0xd6*/  0x00d6,  //Latin Capital Letter O With Diaeresis
    /*0xd7*/  0x00d7,  //Multiplication Sign
    /*0xd8*/  0x00d8,  //Latin Capital Letter O With Stroke
    /*0xd9*/  0x00d9,  //Latin Capital Letter U With Grave
    /*0xda*/  0x00da,  //Latin Capital Letter U With Acute
    /*0xdb*/  0x00db,  //Latin Capital Letter U With Circumflex
    /*0xdc*/  0x00dc,  //Latin Capital Letter U With Diaeresis
    /*0xdd*/  0x00dd,  //Latin Capital Letter Y With Acute
    /*0xde*/  0x00de,  //Latin Capital Letter Thorn
    /*0xdf*/  0x00df,  //Latin Small Letter Sharp S
    /*0xe0*/  0x00e0,  //Latin Small Letter A With Grave
    /*0xe1*/  0x00e1,  //Latin Small Letter A With Acute
    /*0xe2*/  0x00e2,  //Latin Small Letter A With Circumflex
    /*0xe3*/  0x00e3,  //Latin Small Letter A With Tilde
    /*0xe4*/  0x00e4,  //Latin Small Letter A With Diaeresis
    /*0xe5*/  0x00e5,  //Latin Small Letter A With Ring Above
    /*0xe6*/  0x00e6,  //Latin Small Ligature Ae
    /*0xe7*/  0x00e7,  //Latin Small Letter C With Cedilla
    /*0xe8*/  0x00e8,  //Latin Small Letter E With Grave
    /*0xe9*/  0x00e9,  //Latin Small Letter E With Acute
    /*0xea*/  0x00ea,  //Latin Small Letter E With Circumflex
    /*0xeb*/  0x00eb,  //Latin Small Letter E With Diaeresis
    /*0xec*/  0x00ec,  //Latin Small Letter I With Grave
    /*0xed*/  0x00ed,  //Latin Small Letter I With Acute
    /*0xee*/  0x00ee,  //Latin Small Letter I With Circumflex
    /*0xef*/  0x00ef,  //Latin Small Letter I With Diaeresis
    /*0xf0*/  0x00f0,  //Latin Small Letter Eth
    /*0xf1*/  0x00f1,  //Latin Small Letter N With Tilde
    /*0xf2*/  0x00f2,  //Latin Small Letter O With Grave
    /*0xf3*/  0x00f3,  //Latin Small Letter O With Acute
    /*0xf4*/  0x00f4,  //Latin Small Letter O With Circumflex
    /*0xf5*/  0x00f5,  //Latin Small Letter O With Tilde
    /*0xf6*/  0x00f6,  //Latin Small Letter O With Diaeresis
    /*0xf7*/  0x00f7,  //Division Sign
    /*0xf8*/  0x00f8,  //Latin Small Letter O With Stroke
    /*0xf9*/  0x00f9,  //Latin Small Letter U With Grave
    /*0xfa*/  0x00fa,  //Latin Small Letter U With Acute
    /*0xfb*/  0x00fb,  //Latin Small Letter U With Circumflex
    /*0xfc*/  0x00fc,  //Latin Small Letter U With Diaeresis
    /*0xfd*/  0x00fd,  //Latin Small Letter Y With Acute
    /*0xfe*/  0x00fe,  //Latin Small Letter Thorn
    /*0xff*/  0x00ff };//Latin Small Letter Y With Diaeresis
  
  void InplaceUnicode(PWSTR p) {
    while(p && *p) {
      if(*p != UC_SENTINEL) {
        if(*p >= 0 && *p <= 0xFF) {
          *p = cp1252[*p];
        }
      }
       
      p = incxstr(p);
    }
  }
  
  BOOL ConvertKeyboardToUnicode(LPKEYBOARD kbd) {
    LPGROUP gp;
    LPSTORE sp;
    LPKEY kp;
    DWORD i, j;
  
    if(kbd->StartGroup[BEGIN_UNICODE] >= 0 && kbd->StartGroup[BEGIN_UNICODE] < kbd->cxGroupArray) {
      // Keyboard is already Unicode
      return TRUE;
    }
  
    for(sp = kbd->dpStoreArray, i = 0; i < kbd->cxStoreArray; i++, sp++) {
      InplaceUnicode(sp->dpName);
      InplaceUnicode(sp->dpString);
    }
  
    for(gp = kbd->dpGroupArray, i = 0; i < kbd->cxGroupArray; i++, gp++) {
      for(kp = gp->dpKeyArray, j = 0; j < gp->cxKeyArray; j++, kp++) {
        InplaceUnicode(kp->dpContext);
        InplaceUnicode(kp->dpOutput);
      }
  
      InplaceUnicode(gp->dpName);
      InplaceUnicode(gp->dpMatch);
      InplaceUnicode(gp->dpNoMatch);
    }
  
    kbd->StartGroup[BEGIN_UNICODE] = kbd->StartGroup[BEGIN_ANSI];
    kbd->StartGroup[BEGIN_ANSI] = 0xFFFFFFFF;
  
    return TRUE;
  }