【发布时间】:2013-05-29 22:33:26
【问题描述】:
我想将一组给定的System.Windows.Forms.Keys 和一个System.Windows.Forms.InputLanguage 翻译成对应的System.Char。
用MapVirtualKeyEx 尝试了一些实验,但现在可以考虑键盘状态,而ToUnicodeEx 对死键来说很痛苦。
我的目标是一个函数...
static char? FromKeys(Keys keys, InputLanguage inputLanguage)
{
// As I think what can be helpful and I got trying to find a solution for this problem:
Keys vkCode = keys & Keys.KeyCode;
Keys modifiers = keys & Keys.Modifiers;
byte[] keyboardState = new byte[256];
keyboardState[vkCode] = 1 << 7;
if (modifiers.HasFlag(Keys.Shift))
{
keyboardState[(int)Keys.ShiftKey] = 1 << 7;
}
if (modifiers.HasFlag(Keys.Control))
{
keyboardState[(int)Keys.ControlKey] = 1 << 7;
}
if (modifiers.HasFlag(Keys.Alt))
{
keyboardState[(int)Keys.Menu] = 1 << 7;
}
// [Put your code here]
}
... 应该这样调用:
FromKeys(Keys.A | Keys.Shift, InputLanguage.CurrentInputLanguage); // = 'A'
FromKeys(Keys.Escape, InputLanguage.DefaultInputLanguage); // = null
FromKeys(Keys.Oemtilde, InputLanguage.FromCulture(new CultureInfo("de-DE"))); // = 'ö'
FromKeys(Keys.E | Keys.Control | Keys.Alt, InputLanguage.FromCulture(new CultureInfo("de-DE"))); // = '€'
(注意Keys.Shift 和Keys.ShiftKey!)
这个函数是什么样子的?
我将选择的答案应该提供一种将“正常”System.Windows.Forms.Keys 与修饰符(Keys.Shift、Keys.Alt、Keys.Control)的可选组合转换为System.Char 的方法.多次连续调用必须产生相同的字符。没有硬编码的键盘布局,InputLanguage 定义了要使用的布局。
为了帮助理解我想要做什么:生成一个 KeyPressEventArgs,只给出 KeyEventArgs(和正确的 InputLangauge)。
死键不应影响FromKeys!
【问题讨论】:
-
这是作业还是作业?
-
@ChrisF 那门课是什么? =D 不,它只是我正在处理的一个项目,其中我的事件等于 WinForms 中的
KeyDown,但不是KeyPress... -
只是“注意 Keys.Shift 和 Keys.ShiftKey”这句话让我印象深刻,因为它会写在作业上 ;)
-
啊,好吧 :D,我实际上坐了很长时间,这是我掉进的陷阱。
Keys.Shift是 .NET 的说法,其他Keys被修改为这个。而Keys.ShiftKey是键盘上真正的键。