.net 获取按键信息(方向键不能触发 keydown 事件)

148 篇文章 1 订阅

有三个事件可以用于读取按键:KeyPress、KeyDown和KeyUp。当用户按下一个键并松开时,这三个事件的发生顺序是:KeyDown-KeyPress-KeyUp。

KeyPress事件的参数e中有一个char类型的KeyChar属性,因而此事件常用于判断字符。

1 private void textBox1_KeyPress( object sender, System.Windows.Forms.KeyPressEventArgs e)
2         {
3           if(e.KeyChar == char.Parse("A"))
4           {
5                 MessageBox.Show("You pressed A");
6             }
7           if(e.KeyChar == (char)Keys.Enter)
8           {
9                 MessageBox.Show("You pressed Enter");
10             }如果要检查各种功能键,比如F1、光标键、Alt、Ctrl和Shift的组合键等,则需要使用KeyDown和KeyUp事件,按下某个键时,拥有焦点的控件发生KeyDown事件,松开时发生KeyUp事件。
1 private void textBox1_KeyDown( object sender, System.Windows.Forms.KeyEventArgs e)
2         {
3           if(e.Control == true&& e.KeyCode== Keys.C)
4                 MessageBox.Show("You pressed Control + C");
5         }
如果窗体的某个控件拥有焦点,则该控件会接收所有的键盘输入,但有时希望窗体能接收这些输入,这时要将窗体的KeyPreview属性设置为True。窗体先接收这些事件,处理完成后再分配给具有焦点的控件。如果想要仅在窗体级别处理键盘事件并且不允许控件接收键盘事件,请将窗体的事件处理方法中的KeyPressEventArgs.Handled属性设置为True。
1 private void Form1_KeyDown( object sender, System.Windows.Forms.KeyEventArgs e)
2         {
3           if(e.Control == true&& e.KeyCode== Keys.C)
4                 MessageBox.Show("Form Handled");
5             e.Handled= true;
6         }

注册快捷键

    try
    {
        HotKey.UnregisterHotKey(tiePage.Handle, 200);
        HotKey.UnregisterHotKey(tiePage.Handle, 201);
    }
    catch
    {
    }

    try
    {
        HotKey.RegisterHotKey(tiePage.Handle, 200, 0, Keys.Left);
        HotKey.RegisterHotKey(tiePage.Handle, 201, 0, Keys.Right);
    }
    catch
    {
    }
   
    public class HotKey
    {
        public const int WM_HOTKEY = 0x0312;

        [DllImport("user32.dll")]
        public static extern bool RegisterHotKey(
            IntPtr hWnd,                //要定义热键的窗口的句柄
            int id,                     //定义热键ID(不能与其它ID重复)          
            int fsModifiers,            //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
            Keys vk                     //定义热键的内容
            );

        [DllImport("user32.dll")]
        public static extern bool UnregisterHotKey(
            IntPtr hWnd,                //要取消热键的窗口的句柄
            int id                      //要取消热键的ID
            );
    }
    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case HotKey.WM_HOTKEY:
                switch ((Keys)(m.WParam))
                {
                    case Keys.Left: //200
                        imgBtn_LiftArrow_Click(imgBtn_LiftArrow, EventArgs.Empty);
                        break;
                    case Keys.Right: //201
                        imgBtn_RightArrow_Click(imgBtn_RightArrow, EventArgs.Empty);
                        break;
                }
                break;
        }
        base.WndProc(ref m);
    }

 

方向键不能触发 keydown 事件

 

确认:Form1的“Keypreview”属性是否为true!

 

在 vb2005 里面,原来按上下左右的方向键会触发 KeyDown 事件我有 Me.KeyPreview = True ,所以无论焦点在哪都会触发 Me.Keydown 事件不过在添加了按钮等其他东西以后,按方向键只会把焦点从一个按钮转到另一个按钮按其他的键都能触发 Me.KeyDown 事件,好像只有方向键不行有什么办法能让方向键也触发 Me.KeyDown 事件?

 

某些键,如 Tab、Return、Esc 和箭头键,由控件自动处理。所以当你的窗体添加了其它控件如按钮,checkbox等,form的keydown事件就触发不了,为使这些键引发窗体的KeyDown事件,你需要重写form.ProcessDialogKey函数,这个函数可以在消息预处理期间 处理对话字符,例如TAB、RETURN、ESCAPE和箭头键等,以下是我重写了这个事件来处理方向键,你需要把它放到你的代码里:Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean                If keyData = Keys.Left Or keyData = Keys.Right Or keyData = Keys.Up Or keyData = Keys.Down Then            Return False'如果是方向键返回FALSE,意思是继续执行form的keydown事件.        Else            Return MyBase.ProcessDialogKey(keyData)        End If End Function

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值