Сообщение Re: Как получить все символы, которые можно ввести с клавиат от 29.08.2017 22:36
Изменено 30.08.2017 9:59 kov_serg
Re: Как получить все символы, которые можно ввести с клавиат
Здравствуйте, mDmitriy, Вы писали:
D>Всем привет!
D>Subj, собственно
D>Нужен простой способ получить массив всех символов (не управляющих кодов и прочих Del, Home et cetera), которые можно ввести с клавиатуры на русском
D>И такой же на английском
Да нехрен делать
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>И такой же на английском
Да нехрен делать
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 | |
| |