0

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

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

ã -> 一个

o -> o

所以我需要 KeyPress 事件对吗?但是我怎么知道用户输入了例如 'ł' 而不是 alt+L?我现在有一段时间无法理解这一点......

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

4

1 回答 1

2

是的,您需要 KeyPress 事件。或者更确切地说,覆盖 OnKeyPress。将 KeyDown 事件中的虚拟键代码映射到击键非常困难,您必须了解当前的键盘布局。查看ToUnicodeEx()的MSDN 文档,了解您遇到的问题。

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

这是一个例子。启动一个新的 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);
    }
  }
}
于 2009-11-23T16:24:16.393 回答