WinForms,处理所有键=OnKeyPress+;OnKeyDown,但是如何?

WinForms,处理所有键=OnKeyPress+;OnKeyDown,但是如何?,winforms,keyboard,keyboard-shortcuts,onkeypress,onkeydown,Winforms,Keyboard,Keyboard Shortcuts,Onkeypress,Onkeydown,我有一个表单,自定义绘图,没有控件 当我需要从用户那里获得输入时,我转到OnKeyDown事件,然后将事件的KeyData映射到字符串**-这样我就可以识别用户按下了“ctrl X”,等等,所以一切都很正常。。。问题在于不同的键盘设置和特定语言的字母-所以今天我的用户可以 ã->a ó->o 所以我需要按键事件,对吗?但我如何知道用户输入的是例如“ł”而不是alt+L?我一时想不起来了 **-我需要这样做,因为我允许用户配置快捷方式,并使用.ToString()生成不太友好的文本,如“OemPe

我有一个表单,自定义绘图,没有控件

当我需要从用户那里获得输入时,我转到OnKeyDown事件,然后将事件的KeyData映射到字符串**-这样我就可以识别用户按下了“ctrl X”,等等,所以一切都很正常。。。问题在于不同的键盘设置和特定语言的字母-所以今天我的用户可以

ã->a

ó->o

所以我需要按键事件,对吗?但我如何知道用户输入的是例如“ł”而不是alt+L?我一时想不起来了


**-我需要这样做,因为我允许用户配置快捷方式,并使用.ToString()生成不太友好的文本,如“OemPeriod,Control”或更好的文本:“ControlKey,Control”

是的,您需要按键事件。或者更确切地说,覆盖OnKeyPress。将KeyDown事件中的虚拟键代码映射到按键笔划是相当困难的,您必须了解当前的键盘布局。看一看你面对的是什么

您不必担心像Alt+L这样的按键组合。它们不会生成按键事件

这里有一个例子。启动一个新的Windows窗体项目,并使代码如下所示:

using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }
    StringBuilder mText = new StringBuilder();

    protected override void OnKeyPress(KeyPressEventArgs e) {
      if (e.KeyChar == '\b') {
        if (mText.Length > 0) mText.Remove(mText.Length - 1, 1);
      }
      else mText.Append(e.KeyChar);
      Invalidate();
    }

    protected override void OnPaint(PaintEventArgs e) {
      TextFormatFlags fmt = TextFormatFlags.Left;
      TextRenderer.DrawText(e.Graphics, mText.ToString(), this.Font, this.ClientRectangle, Color.Black, fmt);
    }
  }
}

嗯,如果我错了请纠正我,但是KeyDown是在KeyPress事件之前,所以。。。在KeyDown中,我需要知道按下的键是否将由KeyPress处理。。。所以我会用ToUnicodeEx,对吗?但是如果我使用的是ToUnicodeEx,那么我就不需要按键事件了,对吗?不,你不需要知道。按键会让你知道。不要使用ToUnicodeEx()。嗯,我可能用了“错误的方法”,但我用KeyDown处理一切,一切似乎都很好:)但是你能用几行伪代码“显示”我你的解决方案是什么样子吗?我会在有时间的时候检查“正确的”版本,现在我会坚持使用tounicodex(),谢谢!