Как получить все символы, которые можно ввести с клавиатуры?
От: mDmitriy Россия  
Дата: 29.08.17 14:18
Оценка:
Всем привет!

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

Спасибо
Отредактировано 29.08.2017 14:19 mDmitriy . Предыдущая версия .
Re: Как получить все символы, которые можно ввести с клавиатуры?
От: Nikolay_Ch Россия  
Дата: 29.08.17 15:42
Оценка:
Здравствуйте, mDmitriy, Вы писали:

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


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

D>Нужен простой способ получить массив всех символов (не управляющих кодов и прочих Del, Home et cetera), которые можно ввести с клавиатуры на русском
D>И такой же на английском
Через ALT+"трехзначный код" можно ввести вообще любые символы... Или нужны именно кнопки на клавиатуре?
Re[2]: Как получить все символы, которые можно ввести с клавиатуры?
От: mDmitriy Россия  
Дата: 29.08.17 16:20
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>Здравствуйте, mDmitriy, Вы писали:


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


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

D>>Нужен простой способ получить массив всех символов (не управляющих кодов и прочих Del, Home et cetera), которые можно ввести с клавиатуры на русском
D>>И такой же на английском
N_C>Через ALT+"трехзначный код" можно ввести вообще любые символы... Или нужны именно кнопки на клавиатуре?
нет, нужен массив символов
полученный программным путем
Re[3]: Как получить все символы, которые можно ввести с клавиатуры?
От: Nikolay_Ch Россия  
Дата: 29.08.17 20:32
Оценка: +1
Здравствуйте, mDmitriy, Вы писали:

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

D>>>И такой же на английском
N_C>>Через ALT+"трехзначный код" можно ввести вообще любые символы... Или нужны именно кнопки на клавиатуре?
D>нет, нужен массив символов
D>полученный программным путем
Хорошо, ответьте для начала на простой вопрос: что такое "все символы, которые можно ввести с клавиатуры на русском"?
Re[3]: Как получить все символы, которые можно ввести с клавиатуры?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.08.17 21:27
Оценка:
Здравствуйте, mDmitriy, Вы писали:

N_C>>Через ALT+"трехзначный код" можно ввести вообще любые символы... Или нужны именно кнопки на клавиатуре?

D>нет, нужен массив символов
D>полученный программным путем

В такой постановке задача не имеет решения.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re: Как получить все символы, которые можно ввести с клавиат
От: kov_serg Россия  
Дата: 29.08.17 22:36
Оценка: 6 (2)
Здравствуйте, 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='/'
Отредактировано 30.08.2017 9:59 kov_serg . Предыдущая версия . Еще …
Отредактировано 29.08.2017 22:39 kov_serg . Предыдущая версия .
Re[2]: Как получить все символы, которые можно ввести с клавиат
От: Arsen.Shnurkov  
Дата: 30.08.17 05:14
Оценка:
а почему EOL это не Environment.NewLine?
Re[3]: Как получить все символы, которые можно ввести с клавиат
От: kov_serg Россия  
Дата: 30.08.17 06:10
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

AS>а почему EOL это не Environment.NewLine?

Копипаста потому-что. Еще бы про форматирование спросил. Можно было и System.Windows.Forms.Keys вместо int для vk использовать.
Лучше спросили бы почему Alt называется Keys.Menu
Re[4]: Как получить все символы, которые можно ввести с клавиатуры?
От: mDmitriy Россия  
Дата: 30.08.17 08:51
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>Здравствуйте, mDmitriy, Вы писали:


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

D>>>>И такой же на английском
N_C>>>Через ALT+"трехзначный код" можно ввести вообще любые символы... Или нужны именно кнопки на клавиатуре?
D>>нет, нужен массив символов
D>>полученный программным путем
N_C>Хорошо, ответьте для начала на простой вопрос: что такое "все символы, которые можно ввести с клавиатуры на русском"?
имеется ввиду русская раскладка и факультативное использование клавиш Shift/CapsLock/NumLock
их конечное множество, которое мне и хотелось бы получить
тоже самое для английской
Re[4]: Как получить все символы, которые можно ввести с клавиатуры?
От: mDmitriy Россия  
Дата: 30.08.17 08:52
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, mDmitriy, Вы писали:


N_C>>>Через ALT+"трехзначный код" можно ввести вообще любые символы... Или нужны именно кнопки на клавиатуре?

D>>нет, нужен массив символов
D>>полученный программным путем

AVK>В такой постановке задача не имеет решения.

это почему? этих символов ограниченное множество
Re[2]: Как получить все символы, которые можно ввести с клавиат
От: mDmitriy Россия  
Дата: 30.08.17 09:47
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, mDmitriy, Вы писали:


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


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

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

_>Да нехрен делать

Это подойдет, большое спасибо!
Re[5]: Как получить все символы, которые можно ввести с клавиатуры?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.08.17 07:17
Оценка: +1
Здравствуйте, mDmitriy, Вы писали:

AVK>>В такой постановке задача не имеет решения.

D>это почему? этих символов ограниченное множество

Потому что это множество зависит от конкретной клавиатуры и программно определить такое не получится.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[6]: Как получить все символы, которые можно ввести с клавиатуры?
От: mDmitriy Россия  
Дата: 31.08.17 08:09
Оценка:
Здравствуйте, AndrewVK, Вы писали:
AVK>Потому что это множество зависит от конкретной клавиатуры и программно определить такое не получится.
1. на локальной машине скорее всего можно, но зачем?
2. не встречал исправную клавиатуру, которая выдавала бы левые символы в конкретной раскладке
Re[7]: Как получить все символы, которые можно ввести с клавиатуры?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.08.17 08:19
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>2. не встречал исправную клавиатуру, которая выдавала бы левые символы в конкретной раскладке


Дело не в левых символах, а в количестве кнопок. Оно у разных клавиатур разное. Ты бы уже поделился секретом, зачем тебе такое понадобилось.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[8]: Как получить все символы, которые можно ввести с клавиатуры?
От: mDmitriy Россия  
Дата: 31.08.17 12:25
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, mDmitriy, Вы писали:


D>>2. не встречал исправную клавиатуру, которая выдавала бы левые символы в конкретной раскладке


AVK>Дело не в левых символах, а в количестве кнопок. Оно у разных клавиатур разное. Ты бы уже поделился секретом, зачем тебе такое понадобилось.

так меня количество кнопок не волнует — мне надо знать что может прийти с неважно какой кнопки в русской и английской раскладке

это нужно для автозаполнения поля ввода (которое может быть на сайте, терминале и пр.)
вводятся значения из специфичной предметной области, набор символов которой еще окончательно не определен
поэтому все имеющие значения символы должны обрабатываться
проще фильтровать готовый список, чем писать его руками для каждой раскладки
Re[9]: Как получить все символы, которые можно ввести с клавиатуры?
От: AK107  
Дата: 31.08.17 13:29
Оценка: 3 (1)
Здравствуйте, mDmitriy, Вы писали:

AVK>>Дело не в левых символах, а в количестве кнопок. Оно у разных клавиатур разное. Ты бы уже поделился секретом, зачем тебе такое понадобилось.

D>так меня количество кнопок не волнует — мне надо знать что может прийти с неважно какой кнопки в русской и английской раскладке

D>это нужно для автозаполнения поля ввода (которое может быть на сайте, терминале и пр.)

D>вводятся значения из специфичной предметной области, набор символов которой еще окончательно не определен
D>поэтому все имеющие значения символы должны обрабатываться
D>проще фильтровать готовый список, чем писать его руками для каждой раскладки

вам же уже ответили, что любой ASCII силмвол может быть введен с клавиатуры используя ALT-код (с NUMPAD'а)
Re[10]: Как получить все символы, которые можно ввести с клавиатуры?
От: Nikolay_Ch Россия  
Дата: 31.08.17 15:00
Оценка:
Здравствуйте, AK107, Вы писали:

AK>вам же уже ответили, что любой ASCII силмвол может быть введен с клавиатуры используя ALT-код (с NUMPAD'а)

И не ASCII — тоже... А если брать виртуальные клавиатуры, которые получают распространения во всяких терминалах, то там и ALT может быть не нужен...
Re[10]: Как получить все символы, которые можно ввести с клавиатуры?
От: mDmitriy Россия  
Дата: 31.08.17 15:10
Оценка:
Здравствуйте, AK107, Вы писали:
D>>это нужно для автозаполнения поля ввода (которое может быть на сайте, терминале и пр.)
D>>вводятся значения из специфичной предметной области, набор символов которой еще окончательно не определен
D>>поэтому все имеющие значения символы должны обрабатываться
D>>проще фильтровать готовый список, чем писать его руками для каждой раскладки

AK>вам же уже ответили, что любой ASCII силмвол может быть введен с клавиатуры используя ALT-код (с NUMPAD'а)

я в курсе... но меня не интересует, что там введено и каким образом
мое дело — по возможности дать подсказку пользователю
Re[11]: Как получить все символы, которые можно ввести с клавиатуры?
От: Nikolay_Ch Россия  
Дата: 31.08.17 15:41
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>я в курсе... но меня не интересует, что там введено и каким образом

D>мое дело — по возможности дать подсказку пользователю
А не проще ли тогда просто забить все символы русского и английского алфавита в массиве? 26 и 33 буквы, всего делов-то.
Re[12]: Как получить все символы, которые можно ввести с клавиатуры?
От: mDmitriy Россия  
Дата: 04.09.17 08:41
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>А не проще ли тогда просто забить все символы русского и английского алфавита в массиве? 26 и 33 буквы, всего делов-то.
сначала так и было сделано
но потом выяснилось,что в названиях могут встречаться не только они
поэтому и спрашивал про получения списка всего, чтобы потом его ограничить
ну и более другие раскладки потом добавлять
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.