的WinForms,处理所有按键的OnKeyPress = + onkeydown事件,但如何?
-
21-09-2019 - |
题
我有一个表,自定义绘制,没有控件。
当我需要从用户得到我去的onkeydown事件的输入,然后活动的KEYDATA映射到一个字符串** - 这样我就可以识别出用户已经按下“CTRL X”,等等,所以一切几乎是确定...问题是有不同的键盘设置和语言特定的字母 - 所以今天我的用户获得
A - >一
ó - > 0
所以,我需要KeyPress事件吧?但我怎么知道用户在输入例如“L”,而不是ALT + L?我不能让我的周围的头,而现在......
** - 我需要那样做,因为我让用户配置快捷方式和使用的ToString()产生不那么像“OemPeriod,控制”,甚至更好的用户友好的文本:“CONTROLKEY,控制”
解决方案
是的,你需要的按键响应事件。或者更确切地说,覆盖的OnKeyPress。在KeyDown事件到击键映射虚拟键代码是相当困难的,你必须要知道当前的键盘布局。看看在 MSDN文档的ToUnicodeEx(),看看你是什么对抗。
您不必像左右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);
}
}
}
不隶属于 StackOverflow