C# 按下umlaut键时,KeyDown未传递所有按下的键
首先:我使用德语键盘,因此我有德语键盘的按键 描述 在为C# 按下umlaut键时,KeyDown未传递所有按下的键,c#,winforms,keydown,C#,Winforms,Keydown,首先:我使用德语键盘,因此我有德语键盘的按键 描述 在为KeyDown事件编写侦听器时,我注意到有些键不能同时捕获,因此,例如,如果我按下Ü,O,I,U,然后按下p,则pget将被忽略。但是,如果我不按Ü键,我会得到完整的P,O,I,U。这种情况也会发生在组合中,如Ä,A,S,D,F,它们被截断为Ä,A,S,尽管没有Ä它是A,S,D,F 最小示例 我想如果你看到它会更容易理解,所以这里有一个我正在做的最简单的例子。请注意,您需要创建一个表单Form1,因为将所有骨架粘贴到表单之外会分散示例的注意
KeyDown
事件编写侦听器时,我注意到有些键不能同时捕获,因此,例如,如果我按下Ü,O,I,U
,然后按下p
,则p
get将被忽略。但是,如果我不按Ü
键,我会得到完整的P,O,I,U
。这种情况也会发生在组合中,如Ä,A,S,D,F
,它们被截断为Ä,A,S
,尽管没有Ä
它是A,S,D,F
最小示例
我想如果你看到它会更容易理解,所以这里有一个我正在做的最简单的例子。请注意,您需要创建一个表单Form1
,因为将所有骨架粘贴到表单之外会分散示例的注意力
public partial class Form1 : Form
{
private List<Keys> pressedKeys;
private Label label;
public Form1()
{
InitializeComponent();
pressedKeys = new List<Keys>();
label = new Label();
label.Location = new Point(100, 100);
Controls.Add(label);
KeyUp += Form1_KeyUp;
KeyDown += Form1_KeyDown;
}
private void UpdateLabelText()
{
label.Text = string.Join(", ", pressedKeys.Select(x => x.ToString()).ToArray());
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
var key = e.KeyData;
if (!pressedKeys.Contains(key))
{
pressedKeys.Add(key);
UpdateLabelText();
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
pressedKeys.Remove(e.KeyData);
UpdateLabelText();
}
}
公共部分类表单1:表单
{
私人列表按键;
自有品牌;
公共表格1()
{
初始化组件();
按按键=新建列表();
标签=新标签();
标签位置=新点(100100);
控件。添加(标签);
键控+=Form1U键控;
KeyDown+=form1u KeyDown;
}
私有void UpdateLabelText()
{
label.Text=string.Join(“,”,按按键。选择(x=>x.ToString()).ToArray());
}
私有void Form1\u KeyDown(对象发送方,KeyEventArgs e)
{
var key=e.KeyData;
如果(!pressedKeys.Contains(键))
{
按按键。添加(按键);
UpdateLabelText();
}
}
私有void Form1\u KeyUp(对象发送方,KeyEventArgs e)
{
按按键。移除(如按键数据);
UpdateLabelText();
}
}
实际问题
是否有一种方法可以捕获Windows窗体中的所有键盘事件,而不考虑按下了什么键 这不是代码的问题,而是键盘的问题。通常usb键盘没有这个问题,但是如果它是便宜的,那么它可能会发生,用一个好的键盘替换你的键盘。谢谢,这确实是我键盘的翻滚,我不知道。我想我是专门找C#来找这篇文章的@古斯曼:它实际上是一个笔记本电脑键盘,所以更换它会很麻烦。