Информация об изменениях

Сообщение Re: Как получить все символы, которые можно ввести с клавиат от 29.08.2017 22:36

Изменено 30.08.2017 9:59 kov_serg

Re: Как получить все символы, которые можно ввести с клавиат
Здравствуйте, mDmitriy, Вы писали:

D>Всем привет!


D>Subj, собственно

D>Нужен простой способ получить массив всех символов (не управляющих кодов и прочих Del, Home et cetera), которые можно ввести с клавиатуры на русском
D>И такой же на английском

Да нехрен делать
using System;
using System.Text;
using System.Runtime.InteropServices;

class Program {
    [DllImport("user32.dll")]
    static extern int ToUnicodeEx(
        int virtualKeyCode, int scanCode, byte[] keyboardState,
        [Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)]
        StringBuilder receivingBuffer,
        int bufferSize, int flags, int hkl
    );
    enum HKL { EN = 0x409, RU = 0x419 }
    enum KeyFlags { None = 0, Shift = 1, Alt = 2, AltShift = 3 }
    static string GetCharsFromKeys(HKL hkl, int key, KeyFlags flags) {
        const int ShiftKey = 16, ControlKey = 17, Menu = 18;
        var buf = new StringBuilder(256);
        var keyboardState = new byte[256];
        if (flags==KeyFlags.Shift || flags==KeyFlags.AltShift) keyboardState[ShiftKey] = 255;
        if (flags==KeyFlags.Alt || flags==KeyFlags.AltShift) {
            keyboardState[ControlKey] = 255;
            keyboardState[Menu] = 255;
        }
        ToUnicodeEx(key, 0, keyboardState, buf, 256, 0,(int)hkl);
        return buf.ToString();
    }
    const string EOL="\r\n";
    static void ShowKeys(Action<string> print) {
        foreach (HKL hkl in Enum.GetValues(typeof(HKL))) {
            for (int vk = 1; vk < 256; vk++) {
                bool first = true;
                foreach (KeyFlags flag in Enum.GetValues(typeof(KeyFlags))) {
                    var mod = flag == KeyFlags.None ? "" : "+" + flag.ToString();
                    var res = GetCharsFromKeys(hkl, vk, flag);
                    if (res.Length > 0) {
                        if (first) { first = false; print(hkl.ToString()); }
                        var msg=String.Format("\tVK_{0}{1}=", vk, mod );
                        int ch = (int)res[0];
                        if (ch >= 32) msg += "'" + res + "'"; else msg += "char(" + ch + ")";
                        print(msg);
                    }
                }
                if (!first) print(EOL);
            }
            print(EOL);
        }
    }

    static void Main(string[] args) {
        ShowKeys(text => Console.Write(text));
    }
}
Re: Как получить все символы, которые можно ввести с клавиат
Здравствуйте, mDmitriy, Вы писали:

D>Всем привет!


D>Subj, собственно

D>Нужен простой способ получить массив всех символов (не управляющих кодов и прочих Del, Home et cetera), которые можно ввести с клавиатуры на русском
D>И такой же на английском

Да нехрен делать
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

class Program {
    [DllImport("user32.dll")]
    static extern int ToUnicodeEx(
        int virtualKeyCode,int scanCode,byte[] keyboardState,
        [Out,MarshalAs(UnmanagedType.LPWStr,SizeConst = 64)]
        StringBuilder receivingBuffer,
        int bufferSize,int flags,int hkl
    );
    enum HKL { EN = 0x409, RU = 0x419 }
    enum KeyFlags { None = 0, Shift = 1, Alt = 2, AltShift = 3 }
    static bool KeyFlagsHas(KeyFlags key,KeyFlags mask) {
        return 0!=((int)key & (int)mask);
    }
    static string GetCharsFromKeys(HKL hkl,int key,KeyFlags flags) {
        const int ShiftKey = 16,ControlKey = 17,Menu = 18;
        var buf = new StringBuilder(256);
        var keyboardState = new byte[256];
        if (KeyFlagsHas(flags,KeyFlags.Shift)) keyboardState[ShiftKey] = 255;
        if (KeyFlagsHas(flags,KeyFlags.Alt)) {
            keyboardState[ControlKey] = 255;
            keyboardState[Menu] = 255;
        }
        ToUnicodeEx(key,0,keyboardState,buf,256,0,(int)hkl);
        return buf.ToString();
    }
    const string EOL = "\r\n";
    static void ShowKeys(Action<string> print) {
        var kc = new KeysConverter(); 
        foreach (HKL hkl in Enum.GetValues(typeof(HKL))) {
            for (int vk = 1; vk < 256; vk++) {
                bool first = true; string res1="";
                foreach (KeyFlags flag in Enum.GetValues(typeof(KeyFlags))) {
                    var mod = flag == KeyFlags.None ? "" : "+" + flag.ToString();
                    var res = GetCharsFromKeys(hkl,vk,flag);
                    if (res.Length > 0 && res != res1) {
                        if (first) { first = false; res1 = res; print(hkl.ToString()); }
                        var vk_name = kc.ConvertToString((Keys)vk);
                        var msg = String.Format("\tVK_{0}{1}=",vk_name,mod);
                        int ch = (int)res[0];
                        if (ch >= 32) msg += "'" + res + "'"; else msg += "char(" + ch + ")";
                        print(msg);
                    }
                }
                if (!first) print(EOL);
            }
            print(EOL);
        }
    }

    static void Main(string[] args) {
        ShowKeys(text => Console.Write(text));
    }
}

  output
EN    VK_Cancel=char(3)
EN    VK_Назад=char(8)
EN    VK_Tab=char(9)
EN    VK_Enter=char(13)
EN    VK_Escape=char(27)
EN    VK_Space=' '
EN    VK_0='0'    VK_0+Shift=')'
EN    VK_1='1'    VK_1+Shift='!'
EN    VK_2='2'    VK_2+Shift='@'
EN    VK_3='3'    VK_3+Shift='#'
EN    VK_4='4'    VK_4+Shift='$'
EN    VK_5='5'    VK_5+Shift='%'
EN    VK_6='6'    VK_6+Shift='^'
EN    VK_7='7'    VK_7+Shift='&'
EN    VK_8='8'    VK_8+Shift='*'
EN    VK_9='9'    VK_9+Shift='('
EN    VK_A='a'    VK_A+Shift='A'
EN    VK_B='b'    VK_B+Shift='B'
EN    VK_C='c'    VK_C+Shift='C'
EN    VK_D='d'    VK_D+Shift='D'
EN    VK_E='e'    VK_E+Shift='E'
EN    VK_F='f'    VK_F+Shift='F'
EN    VK_G='g'    VK_G+Shift='G'
EN    VK_H='h'    VK_H+Shift='H'
EN    VK_I='i'    VK_I+Shift='I'
EN    VK_J='j'    VK_J+Shift='J'
EN    VK_K='k'    VK_K+Shift='K'
EN    VK_L='l'    VK_L+Shift='L'
EN    VK_M='m'    VK_M+Shift='M'
EN    VK_N='n'    VK_N+Shift='N'
EN    VK_O='o'    VK_O+Shift='O'
EN    VK_P='p'    VK_P+Shift='P'
EN    VK_Q='q'    VK_Q+Shift='Q'
EN    VK_R='r'    VK_R+Shift='R'
EN    VK_S='s'    VK_S+Shift='S'
EN    VK_T='t'    VK_T+Shift='T'
EN    VK_U='u'    VK_U+Shift='U'
EN    VK_V='v'    VK_V+Shift='V'
EN    VK_W='w'    VK_W+Shift='W'
EN    VK_X='x'    VK_X+Shift='X'
EN    VK_Y='y'    VK_Y+Shift='Y'
EN    VK_Z='z'    VK_Z+Shift='Z'
EN    VK_NumPad0='0'
EN    VK_NumPad1='1'
EN    VK_NumPad2='2'
EN    VK_NumPad3='3'
EN    VK_NumPad4='4'
EN    VK_NumPad5='5'
EN    VK_NumPad6='6'
EN    VK_NumPad7='7'
EN    VK_NumPad8='8'
EN    VK_NumPad9='9'
EN    VK_Multiply='*'
EN    VK_Add='+'
EN    VK_Subtract='-'
EN    VK_Decimal='.'
EN    VK_Divide='/'
EN    VK_Oem1=';'    VK_Oem1+Shift=':'
EN    VK_Oemplus='='    VK_Oemplus+Shift='+'
EN    VK_Oemcomma=','    VK_Oemcomma+Shift='<'
EN    VK_OemMinus='-'    VK_OemMinus+Shift='_'
EN    VK_OemPeriod='.'    VK_OemPeriod+Shift='>'
EN    VK_OemQuestion='/'    VK_OemQuestion+Shift='?'
EN    VK_Oemtilde='`'    VK_Oemtilde+Shift='~'
EN    VK_OemOpenBrackets='['    VK_OemOpenBrackets+Shift='{'
EN    VK_Oem5='\'    VK_Oem5+Shift='|'
EN    VK_Oem6=']'    VK_Oem6+Shift='}'
EN    VK_Oem7='''    VK_Oem7+Shift='"'
EN    VK_OemBackslash='\'    VK_OemBackslash+Shift='|'

RU    VK_Cancel=char(3)
RU    VK_Назад=char(8)
RU    VK_Tab=char(9)
RU    VK_Enter=char(13)
RU    VK_Escape=char(27)
RU    VK_Space=' '
RU    VK_0='0'    VK_0+Shift=')'
RU    VK_1='1'    VK_1+Shift='!'
RU    VK_2='2'    VK_2+Shift='"'
RU    VK_3='3'    VK_3+Shift='№'
RU    VK_4='4'    VK_4+Shift=';'
RU    VK_5='5'    VK_5+Shift='%'
RU    VK_6='6'    VK_6+Shift=':'
RU    VK_7='7'    VK_7+Shift='?'
RU    VK_8='8'    VK_8+Shift='*'
RU    VK_9='9'    VK_9+Shift='('
RU    VK_A='ф'    VK_A+Shift='Ф'
RU    VK_B='и'    VK_B+Shift='И'
RU    VK_C='с'    VK_C+Shift='С'
RU    VK_D='в'    VK_D+Shift='В'
RU    VK_E='у'    VK_E+Shift='У'
RU    VK_F='а'    VK_F+Shift='А'
RU    VK_G='п'    VK_G+Shift='П'
RU    VK_H='р'    VK_H+Shift='Р'
RU    VK_I='ш'    VK_I+Shift='Ш'
RU    VK_J='о'    VK_J+Shift='О'
RU    VK_K='л'    VK_K+Shift='Л'
RU    VK_L='д'    VK_L+Shift='Д'
RU    VK_M='ь'    VK_M+Shift='Ь'
RU    VK_N='т'    VK_N+Shift='Т'
RU    VK_O='щ'    VK_O+Shift='Щ'
RU    VK_P='з'    VK_P+Shift='З'
RU    VK_Q='й'    VK_Q+Shift='Й'
RU    VK_R='к'    VK_R+Shift='К'
RU    VK_S='ы'    VK_S+Shift='Ы'
RU    VK_T='е'    VK_T+Shift='Е'
RU    VK_U='г'    VK_U+Shift='Г'
RU    VK_V='м'    VK_V+Shift='М'
RU    VK_W='ц'    VK_W+Shift='Ц'
RU    VK_X='ч'    VK_X+Shift='Ч'
RU    VK_Y='н'    VK_Y+Shift='Н'
RU    VK_Z='я'    VK_Z+Shift='Я'
RU    VK_NumPad0='0'
RU    VK_NumPad1='1'
RU    VK_NumPad2='2'
RU    VK_NumPad3='3'
RU    VK_NumPad4='4'
RU    VK_NumPad5='5'
RU    VK_NumPad6='6'
RU    VK_NumPad7='7'
RU    VK_NumPad8='8'
RU    VK_NumPad9='9'
RU    VK_Multiply='*'
RU    VK_Add='+'
RU    VK_Subtract='-'
RU    VK_Decimal=','
RU    VK_Divide='/'
RU    VK_Oem1='ж'    VK_Oem1+Shift='Ж'
RU    VK_Oemplus='='    VK_Oemplus+Shift='+'
RU    VK_Oemcomma='б'    VK_Oemcomma+Shift='Б'
RU    VK_OemMinus='-'    VK_OemMinus+Shift='_'
RU    VK_OemPeriod='ю'    VK_OemPeriod+Shift='Ю'
RU    VK_OemQuestion='.'    VK_OemQuestion+Shift=','
RU    VK_Oemtilde='ё'    VK_Oemtilde+Shift='Ё'
RU    VK_OemOpenBrackets='х'    VK_OemOpenBrackets+Shift='Х'
RU    VK_Oem5='\'    VK_Oem5+Shift='/'
RU    VK_Oem6='ъ'    VK_Oem6+Shift='Ъ'
RU    VK_Oem7='э'    VK_Oem7+Shift='Э'
RU    VK_OemBackslash='\'    VK_OemBackslash+Shift='/'