C# 将Windows.forms.Keys转换为真实的本地键盘值

C# 将Windows.forms.Keys转换为真实的本地键盘值,c#,.net,winforms,C#,.net,Winforms,我使用名称空间Windows.Forms.Keys 我希望能够捕捉并使用一些特殊的字符,如é、è、á、ç,但当程序启动事件KeyDown时,KeyEventArg只会将值“D1”返回给“D9” 如何获得与这些键关联的真实字符?简短回答:使用KeyPress而不是KeyDown KeyDown实际上是设计用来处理键盘的物理布局的(好吧,physica的逻辑布局……算了吧:D)。这与给定物理键所表示的字符非常不同 另一方面,KeyPress是指从键盘输入字符,而不是按键。请注意,KeyPress如何

我使用名称空间Windows.Forms.Keys

我希望能够捕捉并使用一些特殊的字符,如é、è、á、ç,但当程序启动事件KeyDown时,KeyEventArg只会将值“D1”返回给“D9”


如何获得与这些键关联的真实字符?

简短回答:使用
KeyPress
而不是
KeyDown

KeyDown
实际上是设计用来处理键盘的物理布局的(好吧,physica的逻辑布局……算了吧:D)。这与给定物理键所表示的字符非常不同

另一方面,
KeyPress
是指从键盘输入字符,而不是按键。请注意,
KeyPress
如何支持AltGr+
someKey
和字符重复等功能

如果您确实需要使用
KeyDown
/
keydup
,则必须模拟windows键盘系统的工作方式来确定要输出的字符(例如,如果您正在为游戏或类似游戏制作键盘映射屏幕)。您可以使用ToAscii-WinAPI方法()

除此之外,您还必须理解组合键的含义-例如,在我的键盘上,如果我按1,我会得到
+
。如果我按Shift+1,我得到
1
。如果我按AltGr+1,我会得到
。你关心哪一个?可能Shift+1应该解释为
1
(按键的作用)。也许它应该被解释为Shift+1(最简单的,你已经有了)。也许它应该解释为Shift++,这是游戏中热键绑定或键盘映射通常使用的方式


现在应该很明显,这其实远远不是小事。您需要一些机制来解释“原始”输入数据,不同的解释对于不同的初始条件有不同的意义。你基本上要求在两个明显的选项之间混合使用一种方法-你混合使用虚拟键和“真实”字符。

简短回答:使用
按键
而不是
按键

KeyDown
实际上是设计用来处理键盘的物理布局的(好吧,physica的逻辑布局……算了吧:D)。这与给定物理键所表示的字符非常不同

另一方面,
KeyPress
是指从键盘输入字符,而不是按键。请注意,
KeyPress
如何支持AltGr+
someKey
和字符重复等功能

如果您确实需要使用
KeyDown
/
keydup
,则必须模拟windows键盘系统的工作方式来确定要输出的字符(例如,如果您正在为游戏或类似游戏制作键盘映射屏幕)。您可以使用ToAscii-WinAPI方法()

除此之外,您还必须理解组合键的含义-例如,在我的键盘上,如果我按1,我会得到
+
。如果我按Shift+1,我得到
1
。如果我按AltGr+1,我会得到
。你关心哪一个?可能Shift+1应该解释为
1
(按键的作用)。也许它应该被解释为Shift+1(最简单的,你已经有了)。也许它应该解释为Shift++,这是游戏中热键绑定或键盘映射通常使用的方式


现在应该很明显,这其实远远不是小事。您需要一些机制来解释“原始”输入数据,不同的解释对于不同的初始条件有不同的意义。基本上,您要求在两个明显的选项之间混合使用一种方法,即混合使用虚拟键和“真实”字符。

KeyDown事件与正在键入的字符是完全不同的。例如,如果同时按住Ctrl键,那不是一个字符等。它与实际的物理键有关,这可能与输入框聚焦时键的效果大不相同。按键事件与正在键入的字符截然不同。例如,如果同时按住Ctrl键,那不是一个字符等。它与实际的物理键有关,这可能与输入框聚焦时键的效果大不相同。按键事件与正在键入的字符截然不同。例如,如果同时按住Ctrl键,这不是一个字符等。它与实际的物理键有关,这可能与输入框聚焦时键的效果有很大不同。好吧,谢谢,我走错了方向。如果我想截取角色和功能键,我想我应该直接启动2事件?@GlorfSf这在很大程度上取决于你到底想做什么。为什么要捕捉字符/按键?为了简单起见,我必须观察一些用户的行为,比如键入文本或单击某个位置,以便使程序能够在以后模拟这些相同的行为。我需要捕捉F1-F9、tab等函数键,如果能得到用户想要输入的确切文本,我会很有帮助。@GlorfSf啊,对,不要这样做。这就是UI自动化的目的-。如果您仍然使用Winforms,则可能需要将处理的消息记录在
WndProc
中(可能需要进行一些过滤)。在需要时重播消息非常容易——这基本上就是Excel中宏的工作方式。Windows内置了GUI自动化:)好吧,谢谢,我走错了路。如果我想截取角色和功能键,我想我应该直接启动2事件?@GlorfSf这在很大程度上取决于你到底想做什么。你为什么这么生气