C#Winform编程中合理地设计程序热键

在C#Winform编程中,合理的设计程序热键,使视障用户更加便捷使用

我们都知道,视障人士使用电脑主要是借助屏幕阅读器的朗读和操作,这种辅助操作基本都是通过键盘操作来完成的

在程序设计中,一款优秀的软件,不仅要有好的功能,可以解决用户的实际问题,而且也需要考虑如何能让用户更加高效便捷的使用

例如,窗口界面上有许多控件,那么我们不仅要考虑这些控件视障用户是否可以操作,而且也需要考虑如何能让视障用户更高效便捷的使用这些控件功能

在C#winform程序开发中,我们可以通过合理设计程序的热键,通过按下对应热键,执行相应的功能,让键盘操作更加便捷,可使操作的时间大大减少

这种操作尤其对于现如今许多视障人士通过互联网进行办公的场景,可起到事半功倍的作用

提升工作效率,使工作更加高效

下面总结了c#winform编程中四种常用的设置热键的方式

*一、Alt + (按钮快捷键)

在button、label、menuStrip,ToolStripMenuItem等控件设置Text属性时在名称后边加(&键名(,例如button1.text= “用户登陆(&L)”

就可为button1设置快捷键,这时候按Alt+L就可执行用户登陆事件

二、窗体的按键事件

在WinForm中设置要使用组合键的窗体的KeyPreview(向窗体注册键盘事件)属性为True
在这里插入图片描述

然后使用窗体的KeyDown事件(在首次按下某个键时发生)

实例代码:

private void LD007MainForm_KeyDown(object sender, KeyEventArgs e)
        {

            switch (e.KeyData)
            {
                case Keys.F1:
                    e.Handled = true;//将Handled设置为true,指示已经处理过KeyPress事件
                    if (tabControl.SelectedTab.Text == "波形读取")
                    {
                        button_ReadNewWaveOrder.Focus();//将键盘焦点聚焦到textBox1控件上。
                        button_ReadNewWaveOrder.PerformClick();//执行按钮点击操作
                    }
                    break;

                case Keys.F2:
                    e.Handled = true;//将Handled设置为true,指示已经处理过KeyPress事件
                    if (tabControl.SelectedTab.Text == "波形读取")
                    {
                        button_ReadWave.Focus();//将键盘焦点聚焦到textBox1控件上。
                        button_ReadWave.PerformClick();//执行按钮点击操作
                    }
                    break;

                case Keys.F3:
                    e.Handled = true;//将Handled设置为true,指示已经处理过KeyPress事件
                    if (tabControl.SelectedTab.Text == "波形读取")
                    {
                        button_SetADCZeroCode.Focus();//将键盘焦点聚焦到textBox1控件上。
                        button_SetADCZeroCode.PerformClick();//执行按钮点击操作
                    }
                    break;

                case Keys.F4:
                    e.Handled = true;//将Handled设置为true,指示已经处理过KeyPress事件
                    if (tabControl.SelectedTab.Text == "波形读取")
                    {
                        button_ReadADCPara.Focus();//将键盘焦点聚焦到textBox1控件上。
                        button_ReadADCPara.PerformClick();//执行按钮点击操作
                    }
                    break;

                case (Keys.Up | Keys.Control)://按下alt+s键
                    e.Handled = true;//将Handled设置为true,指示已经处理过KeyPress事件
                    if (tabControl.SelectedTab.Text == "波形读取")
                    {
                       
                        if (numericUpDown_SlaveID.Value <127)
                            numericUpDown_SlaveID.Value++;
                    }
                    break;

                case (Keys.Down | Keys.Control)://按下alt+s键
                    e.Handled = true;//将Handled设置为true,指示已经处理过KeyPress事件
                    if (tabControl.SelectedTab.Text == "波形读取")
                    {
                        if (numericUpDown_SlaveID.Value >1)
                            numericUpDown_SlaveID.Value--;
                    }
                    break;

                case (Keys.Up | Keys.Alt)://按下alt+s键
                    e.Handled = true;//将Handled设置为true,指示已经处理过KeyPress事件
                    if (tabControl.SelectedTab.Text == "波形读取")
                    {
                       
                        if (numericUpDown_WaveOder.Value < 5)
                            numericUpDown_WaveOder.Value++;
                    }
                    break;

                case (Keys.Down | Keys.Alt)://按下alt+s键
                    e.Handled = true;//将Handled设置为true,指示已经处理过KeyPress事件
                    if (tabControl.SelectedTab.Text == "波形读取")
                    {
                        
                        if (numericUpDown_WaveOder.Value >1)
                            numericUpDown_WaveOder.Value--;
                    }
                    break;


                case (Keys.C | Keys.Alt)://按下alt+x
                    e.Handled = true;//将Handled设置为true,指示已经处理过KeyPress事件
                    if (tabControl.SelectedTab.Text == "波形读取")
                    {
                        button_CalWavePeakValue.Focus();
                        button_CalWavePeakValue.PerformClick(); 
                    }
                    break;

                case Keys.Escape://按下alt+x
                    if (tabControl.SelectedTab.Text == "波形读取")
                    {
                        this.Close();   //关闭窗口  
                    }
                   
                    break;

                default:                   
                    break;
            }
        }

     private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == (Keys.S | Keys.Alt))//按下alt+s键
            {
e.Handled = true;//将Handled设置为true,指示已经处理过KeyPress事件
                textBox1.Focus();//将键盘焦点聚焦到textBox1控件上。
            }
            else if (e.KeyData == (Keys.X | Keys.Alt))//按下alt+x
            {
e.Handled = true;
                this.showMsg("hello world!");//执行showMsg方法
            }
            else if (e.KeyData == Keys.Escape)//按下esc键
                this.Close();   //关闭窗口  
        }

//注:可以参考 ”Keys”的枚举参数,以实现自己需要的按键

三、ToolStripMenuItem控件的ShortcutKeys属性

在ToolStripMenuItemShortcutKeys属性中也可设置快捷键

在窗体工具箱添加一个contextMenuStrip1,将其邦定到ListView1上,给contextMenuStrip1的items添加一个ToolStripMenuItem

然后设置ToolStripMenuItem的ShortcutKeys属性

例如设置为“Ctrl+L”,此时按下Ctrl+L就可激活ToolStripMenuItem的click事件

四、全局快捷键

实例代码:

public class HotKey//定义注册和卸载热键的类
        {
            [DllImport("kernel32.dll")]
            public static extern uint GetLastError();
            //如果函数执行成功,返回值不为0。
            //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
            [DllImport("user32.dll", SetLastError = true)]
            public static extern bool RegisterHotKey(
                 IntPtr hWnd,                //要定义热键的窗口的句柄
                int id,                     //定义热键ID(不能与其它ID重复)           
                 int fsModifiers,   //辅助键,不设置=0,Alt=1、Ctrl=2、Shift=4、Windows=8
                Keys vk                     //定义的热键
                );
            [DllImport("user32.dll", SetLastError = true)]
            public static extern bool UnregisterHotKey(
                 IntPtr hWnd,                //要取消热键的窗口的句柄
                int id                      //要取消热键的ID
                 );

        }
//定义消息相关的常量
        private const int WM_HOTKEY = 0x312; //窗口消息-热键
        private const int WM_CREATE = 0x1; //窗口消息-创建
        private const int WM_DESTROY = 0x2; //窗口消息-销毁
        private const int keyID = 0x3572; //热键ID
//重写窗体的WndProc函数,在窗口创建的时候注册热键,窗口销毁时销毁热键
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            switch (m.Msg)
            {
                case WM_HOTKEY: //窗口消息-热键ID
                    switch (m.WParam.ToInt32())
                    {
                        case keyID: //热键ID
                            this.openMsg();//按下Ctrl+alt+m执行的方法
                            break;
                        default:
                            break;
                    }
                    break;
                case WM_CREATE: //窗口消息-创建
                    HotKey.RegisterHotKey(Handle, keyID, 3, Keys.M);//设置Ctrl+alt+m热键
                    break;
                case WM_DESTROY: //窗口消息-销毁
                    HotKey.UnregisterHotKey(Handle, keyID); //销毁热键
                    break;
                default:
                    break;
            }
        }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值