中易网

请问在C#的textbox空间里 如何实现 输入按键 显示按键名

答案:5  悬赏:60  
解决时间 2021-04-28 14:38
就是比如在一个游戏里设置一个快捷键
窗体上一个label空间显示快捷功能名称 后面有个textbox用于用户输入指定按键,输入键以后,显示这个键的名称,输入f就显示F,输入F1就显示F1 然后再用button的click方法把输入的键值写入XML文件.
现在遇到的问题是 我用一些普通的方法 比如在textbox的keypress方法里,用e.keychar.tostring()这样的方法,无法捕获F1-F9以及DELETE这样的功能键,以及CTRL,ALT,SHIFT+普通键 这样的符合键.
查阅MSDN看到ConsoleKeyInfo可以在控制台命令程序里很方便实现上面我说的功能,但是在窗体控件里,我用同样的方法却显示失败.
请教教我这个功能怎么实现.读写XML我会了,就是怎么输入按键显示 按键名这个功能
已经用keyup事件实现
代码如
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
textBox1.Text = e.KeyCode.ToString();
e.Handled = true;
}
但是还是有问题 如果是ctrl alt shift+字母键这样的组合 就无法了.继续求救
最佳答案
这是一个快捷键的控件,把它放到自己的程序集里,就能像普通控件一样使用。

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace System.Windows.Forms.HotKeyTextBox
{

class HotKey
{
private WinHotKey.KeyModifiers _Modifiers;
private Keys _Key;
public WinHotKey.KeyModifiers Modifiers
{
set { _Modifiers = value; } //& WinHotKey.KeyModifiers.Mask; }
get { return _Modifiers; }
}
public Keys Key
{
set { _Key = value; }
get { return _Key; }
}
}

class WinHotKey
{
private IntPtr Handle;
private int Count = 0;
/// <summary>
/// 初始化
/// </summary>
/// <param name="Handle">窗口的句柄</param>
public WinHotKey(IntPtr Handle)
{
this.Handle = Handle;
}
/// <summary>
/// 自动清除快捷键
/// </summary>
~WinHotKey()
{
for (int i = 0; i < Count; i++)
UnregisterHotKey(Handle, i);
}
/// <summary>
/// 设置一个快捷键
/// </summary>
/// <param name="HotKey">快捷键列表</param>
public void SetHotKey(params HotKey[] @HotKey)
{
Count = @HotKey.Length;
for (int i = 0; i < Count; i++)
RegisterHotKey(Handle, i, @HotKey[i].Modifiers, @HotKey[i].Key);
}

[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);

[DllImport("user32.dll", SetLastError = true)]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

//[Flags()]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Windows = 8,
// Mask = 0xf
}
}

class HotKeyTextBox : TextBox
{
private HotKey _HotKey = new HotKey();
private Keys LastKey;

public HotKeyTextBox()
{
this.KeyDown += new KeyEventHandler(HotKeyTextBox_KeyDown);
this.KeyUp += new KeyEventHandler(HotKeyTextBox_KeyUp);
this.KeyPress += new KeyPressEventHandler(HotKeyTextBox_KeyPress);
}

private void HotKeyTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
}

private void HotKeyTextBox_KeyUp(object sender, KeyEventArgs e)
{
if (!(e.KeyValue == 18 | e.KeyValue == 17 | e.KeyValue == 16)) LastKey = Keys.None;
if (_HotKey.Key == Keys.None)
{
string v = string.Empty;
_HotKey.Modifiers = WinHotKey.KeyModifiers.None;
if (e.Control)
{
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Control;
v += "Ctrl + ";
}
if (e.Shift)
{
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Shift;
v += "Shift + ";
}
if (e.Alt)
{
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Alt;
v += "Alt + ";
}
if (string.IsNullOrEmpty(v)) this.Text = Keys.None.ToString();
else this.Text = v;
}
}

private void HotKeyTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 46)
{
_HotKey.Key = Keys.None;
_HotKey.Modifiers = WinHotKey.KeyModifiers.None;
this.Text = string.Empty;
}
string v = string.Empty;
_HotKey.Modifiers = WinHotKey.KeyModifiers.None;
if (e.Control)
{
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Control;
v += "Ctrl + ";
}
if (e.Shift)
{
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Shift;
v += "Shift + ";
}
if (e.Alt)
{
_HotKey.Modifiers |= WinHotKey.KeyModifiers.Alt;
v += "Alt + ";
}
if (e.KeyValue == 18 | e.KeyValue == 17 | e.KeyValue == 16)
{
if (LastKey == Keys.None)
_HotKey.Key = Keys.None;
else
v += _HotKey.Key.ToString();
}
else
{
_HotKey.Key = e.KeyCode;
v += _HotKey.Key.ToString();
}
LastKey = _HotKey.Key;
this.Text = v;
}

public HotKey @HotKey
{
set
{
_HotKey = value;
string v = string.Empty;
if ((value.Modifiers & WinHotKey.KeyModifiers.Control) == WinHotKey.KeyModifiers.Control) v += "Ctrl + ";
if ((value.Modifiers & WinHotKey.KeyModifiers.Shift) == WinHotKey.KeyModifiers.Shift) v += "Shift + ";
if ((value.Modifiers & WinHotKey.KeyModifiers.Alt) == WinHotKey.KeyModifiers.Alt) v += "Alt + ";
v += _HotKey.Key.ToString();
this.Text = v;
}
get
{
return _HotKey;
}
}
}
}
全部回答
用哈希表
你好! CTRl+普通键的方法:按下ctrl+普通键后,e.keychar会得到值,只是不一定能够正常显示,譬如ctrl+a得到的char对应的整数是1,ctrl+b得到的char对应的整数是2,你自己建立一个对应关系,得到1显示ctrl+a,得到2显示ctrl+b就可以了。 textbox的keypress貌似不响应功能键的按下……等待高手 打字不易,采纳哦!
按键的集合不一样 e.KeyCode == Keys.F4 e.Modifiers == Keys.Alt 这样应该明白了吧。
CTRl+普通键的方法:按下ctrl+普通键后,e.keychar会得到值,只是不一定能够正常显示,譬如ctrl+a得到的char对应的整数是1,ctrl+b得到的char对应的整数是2,你自己建立一个对应关系,得到1显示ctrl+a,得到2显示ctrl+b就可以了。 textbox的keypress貌似不响应功能键的按下……等待高手
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
盐城有学灯光师的地方吗?
山寨手机有智能的么
WOW牧师暗言术灭是几级学的
苏州的真丝手工围巾要多少钱、送别人丝巾有什
我要找工作,但不知道做什么
第五街我想知道这个在什么地方
他们到底是谁
问一下,我在一个地方工作了不到一个月,想辞
找歌拉,很急的拉!
自己构造的大量UDP包,无法被交换机接口接收
三星Android为什么比其他牌子的便宜
天之娇子 条形码为6901028025928的香烟多少钱
QQ号为6个8的怎么没等级?
刘亦菲她结婚了吗
女朋友让男同事送回家男同事开玩笑说要亲亲她
推荐资讯
取一个非主流忧伤的名字(不是可爱的,单相思
今天下午1282次列车要明天几点到达河泽
中文句型转换
所有刻骨铭心的爱都灵魂游离于床上的瞬间~ ,
2010年6月19日快乐大本营直播下载全集视频高
一个男人一生会有几个女人
五个人打一个人,受伤后要赔偿,五个人怎么赔
买4本练习本,一支圆珠笔,10块橡皮要11元,
天龙八部 TS派怎么加点?
麻烦问下各位,《铁齿铜牙纪晓岚》里皇太后是
电话没打通移动公司能查出来么在线等
佳美喜铺怎么去啊,有知道地址的么
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?