我有一张表格,自定义图纸,没有控件。
当我需要从用户那里获取输入时,我转到OnKeyDown事件,然后将事件的KeyData映射到字符串** - 这样我就能识别出用户已按下“ctrl X”等,所以一切都差不多...问题在于不同的键盘设置和特定于语言的字母 - 所以今天我的用户得到了
ã - >一个
ó - > Ø
所以我需要KeyPress活动吗?但是我怎么知道用户输入的例如'ł'而不是alt + L?我现在暂时无法理解......
** - 我需要这样做,因为我让用户配置快捷方式并使用.ToString()产生不那么用户友好的文本,如“OemPeriod,Control”甚至更好:“ControlKey,Control”
答案 0 :(得分:2)
是的,您需要KeyPress事件。或者更确切地说,重写OnKeyPress。将KeyDown事件中的虚拟键代码映射到键击非常困难,您必须了解当前的键盘布局。看一下MSDN docs for ToUnicodeEx(),看看你遇到了什么。
您不必担心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);
}
}
}