zoukankan      html  css  js  c++  java
  • C# 设置按钮快捷键

    参考自:https://www.cnblogs.com/lusunqing/p/3200656.html

    一、C# button快捷键之第一种:Alt + *(按钮快捷键)

      在Button按钮的Text属性的文本名称加(&键名)就可以了,如button1.Text = "保存(&S)"; 这样只要按Alt+S就可以执行按钮的单击事件。

    二、C# button快捷键之第二种:Ctrl+*及其他组合键

      在WinForm中设置要使用组合键的窗体的KeyPreview(向窗体注册键盘事件)属性为True;然后使用窗体的KeyDown事件(在首次按下某个键时发生)或KeyPress事件或KeyUp事件

    复制代码
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
       // if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.S) if (e.KeyCode == Keys.S && e.Control) { button1.PerformClick(); //执行单击button1的动作 } }
    复制代码

    还有一个问题,当使用Ctrl + *快捷键时,对于焦点在可写的控件(如TextBox)上时,可能会将* 键值同时输入,则需要加另一句话将Handled设置为true,以取消 KeyDown 事件。

    复制代码
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
         if (e.KeyCode == Keys.S && e.Control) 
         {
              e.Handled = true;       //将Handled设置为true,指示已经处理过KeyDown事件   
                button1.PerformClick(); //执行单击button1的动作   
        }
    }
    复制代码

    三、C# button快捷键之第三种方法(不推荐使用该方式)

      还是以button为例。给form添加一个contextMenuStrip1,将其邦定到form窗体的ContextMenuStrip属性上。给contextMenuStrip1添加一个item,然后为它设置快捷键(在右键菜单项的ShortcutKeys属性上设置快捷键),将它的Visible属性设为false,并且将它的点击事件设为button的点击事件方法。这样,C#button快捷键设置成功。

    四、C# button快捷键之第四种方法:重写ProcessCmdKey(ref Message msg, Keys keyData)方法

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    { 
             //处理要做的事,
             //不希望做其它做用,return true
             // 要做其它的  return base.ProcessCmdKey(ref msg, keyData);      
    } 
    复制代码
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        // 按快捷键Ctrl+S执行按钮的点击事件方法
        if (keyData == (Keys)Shortcut.CtrlS)
        {
            button1.PerformClick();
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData); // 其他键按默认处理 
    }
    复制代码
    复制代码
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        // 实现按Enter键来实现Ctrl+S键的功能
        if (keyData == Keys.Enter)
        {
            SendKeys.Send("^s");
            return true;
        }
        // 按快捷键Ctrl+S执行按钮的点击事件方法
      //if (keyData == (Keys.Control | Keys.S))
    if (keyData == (Keys)Shortcut.CtrlS) { button1.PerformClick(); return true; } return base.ProcessCmdKey(ref msg, keyData); // 其他键按默认处理 
    }
    复制代码

    SendKeys.Send(string keys),要发送的键字符串,可以查看MSDN:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.sendkeys.send(v=VS.80).aspx

     如果ProcessCmdKey(ref Message msg, Keys keyData)方法的效果不行,可以试试ProcessDialogKey(Keys keyData)方法

    复制代码
    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (keyData == Keys.Enter)
      {
          keyData = Keys.Tab;
          //ProcessTabKey(true);
      }
        return base.ProcessDialogKey(keyData);
    }
    复制代码

     另:Form 重写ProcessCmdKey: 解决enter同时Tab 的问题

    复制代码
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
         if (keyData == Keys.Enter && ((!(ActiveControl is System.Windows.Forms.TextBox) 
             || !((System.Windows.Forms.TextBox)ActiveControl).AcceptsReturn)))
        {
            SendKeys.SendWait("{Tab}");
            return true;
        }
        if (keyData == ( Keys.Enter | Keys.Shift))
        {
            SendKeys.SendWait("+{Tab}");
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
    复制代码

     五C# button快捷键之第五种方法:使用系统API (来自:http://blog.sina.com.cn/s/blog_674a665801013hit.html

    复制代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                MessageBox.Show("使用快捷键启动按钮");
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                 //注册热键Ctrl+F12,这里的8879就是一个ID识别
                RegisterHotKey(this.Handle, 8879, 2, Keys.F12);
            }
    
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                  //用来取消注册的热键
                 UnregisterHotKey(this.Handle, 8879);
            }
     
            /// <summary>
            /// 注册热键
           /// </summary>
            /// <param name="hWnd">为窗口句柄</param>
            /// <param name="id">注册的热键识别ID</param>
            /// <param name="control">组合键代码  Alt的值为1,Ctrl的值为2,Shift的值为4,Shift+Alt组合键为5
            ///  Shift+Alt+Ctrl组合键为7,Windows键的值为8
            /// </param>
            /// <param name="vk">按键枚举</param>
            /// <returns></returns>
            [DllImport("user32")]
            public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);
    
            /// <summary>
            /// 取消注册的热键
            /// </summary>
            /// <param name="hWnd">窗口句柄</param>
            /// <param name="id">注册的热键id</param>
            /// <returns></returns>
            [DllImport("user32")]
            public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    
            // 响应热键
            protected override void WndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case 0x0312:                                 //这个是window消息定义的注册的热键消息     
                        if (m.WParam.ToString().Equals("8879"))   //如果是注册的那个热键     
                        {
                            // 执行button按钮
                            button1.PerformClick();
                        }
                        break;
                }
                base.WndProc(ref m);
            }
        }
    }
    复制代码
  • 相关阅读:
    解决:Ubuntu12.04下使用ping命令返回ping:icmp open socket: Operation not permitted的解决
    【Magenta 项目初探】手把手教你用Tensorflow神经网络创造音乐
    python表达式操作符【学习python必知必会】
    关于提高python程序执行效率的思路和想法
    动手前的构思在编写程序中的重要性
    python 之禅
    HTTP 访问学习笔记 留坑
    软件工程与方法学——面向对象程序设计例子
    python 英文字串首字母改为大写
    Objective-C:方法缓存
  • 原文地址:https://www.cnblogs.com/tk-bolg/p/12831681.html
Copyright © 2011-2022 走看看