欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# WinForm快捷键设置技巧

程序员文章站 2023-02-21 15:10:58
1、alt+*(按钮快捷键) 按钮快捷键也为最常用快捷键,其设置也故为简单。在大家给button、label、menustrip等其他控件的text属性指定名称时,在其后...

1、alt+*(按钮快捷键)

按钮快捷键也为最常用快捷键,其设置也故为简单。在大家给button、label、menustrip等其他控件的text属性指定名称时,在其后面加上‘&'然后在加上一个指定字母即可。如:确定(&d),(alt+d)调用。

如指定多个字母,则第一个为快捷键。如:确定(&ok),(alt+o)调用;文件(&fill),(alt+f)调用。

2、ctrl+*及其他组合键

把 form 的 keypreview 属性设为 true

使用modifiers可设置组合键,键盘数字区按键的keys枚举以d打头,而小键盘上的数字以numpad打头。按下ctrl与shift组合键的方法与其类似,将ctrl和alt的枚举转换为int型相加后与modifiers对比,这样即可判断是否按下了该组合键。

private void  frmmain_keydown(object sender, keyeventargs e)
{
      //比如你的窗体名是frmmain,确定按钮btnok,保存按钮btnsave
      //单键
     switch (e.keycode)
     {
          case keys.f1:
            btnok_click(this, eventargs.empty);
            break;
           case keys.f2:
             btnsave_click(this, eventargs.empty); 
             break; 
     }
      // 组合键
      if (e.keycode == keys.f1 && e.modifiers == keys.control)     //ctrl+f1
      {
        btnshouyi_click(this, eventargs.empty);
      }
   if ((int)e.modifiers == ((int)keys.control + (int)keys.alt) && e.keycode == keys.d0)  //ctrl + alt + 数字0
   {
     messagebox.show("按下了control + alt + 0");
      }

         另外的,与窗体的acceptbutton属性相关联的按钮,将与键盘上的enter键对应;与窗体的cancelbutton属性相关联的按钮,将与键盘上的ecs键对应。
}

======================================================

键   代码    

  backspace   {backspace}、{bs}   或   {bksp}   
  break   {break}   
  caps   lock   {capslock}   
  del   或   delete   {delete}   或   {del}   
  down   arrow(下箭头键)   {down}   
  end   {end}   
  enter   {enter}   或   ~   
  esc   {esc}   
  help   {help}   
  home   {home}   
  ins   或   insert   {insert}   或   {ins}   
  left   arrow(左箭头键)   {left}   
  num   lock   {numlock}   
  page   down   {pgdn}   
  page   up   {pgup}   
  print   screen   {prtsc}(保留供将来使用)   
  right   arrow(右箭头键)   {right}   
  scroll   lock   {scrolllock}   
  tab   {tab}   
  up   arrow(上箭头键)   {up}   
  f1   {f1}   
  f2   {f2}   
  f3   {f3}   
  f4   {f4}   
  f5   {f5}   
  f6   {f6}   
  f7   {f7}   
  f8   {f8}   
  f9   {f9}   
  f10   {f10}   
  f11   {f11}   
  f12   {f12}   
  f13   {f13}   
  f14   {f14}   
  f15   {f15}   
  f16   {f16}   
  数字键盘加号   {add}   
  数字键盘减号   {subtract}   
  数字键盘乘号   {multiply}   
  数字键盘除号   {divide}   

**********************************************************************篇3**************************************************************************************************

#region 快捷键相关
///
/// 记录快捷键
///

private void txthotkey_keydown(object sender, keyeventargs e)
{
  int hotkeyvalue = 0;
  string hotkeystring = "";
  e.suppresskeypress = false;
  e.handled = true;
  if (e.modifiers != keys.none)
  {
    switch (e.modifiers)
    {
      case keys.control:
        hotkeystring += "ctrl + ";
        hotkeyvalue = (int)e.modifiers;
        break;
      case keys.alt:
        hotkeystring += "alt + ";
        hotkeyvalue = (int)e.modifiers;
        break;
      case keys.shift:
        hotkeystring += "shift + ";
        hotkeyvalue = (int)e.modifiers;
        break;
      case keys.control | keys.alt:
        hotkeystring += "ctrl + alt + ";
        hotkeyvalue = (int)e.modifiers;
        break;
      case keys.control | keys.shift:
        hotkeystring += "ctrl + shift + ";
        hotkeyvalue = (int)e.modifiers;
        break;
      case keys.alt | keys.shift:
        hotkeystring += "alt + shift + ";
        hotkeyvalue = (int)e.modifiers;
        break;
      case keys.control | keys.alt | keys.shift:
        hotkeystring += "ctrl + alt + shift + ";
        hotkeyvalue = (int)e.modifiers;
        break;
    }
    if (e.keycode != keys.none && e.keycode != keys.controlkey && e.keycode != keys.menu && e.keycode != keys.shiftkey)
    {
      hotkeystring += keycodetostring(e.keycode);
      hotkeyvalue += (int)e.keycode;
    }
  }
  else
  {
    if (e.keycode == keys.delete || e.keycode == keys.back)
    {
      hotkeystring = "无";
      hotkeyvalue = -1;
    }
    else if (e.keycode != keys.none)
    {
      hotkeystring = keycodetostring(e.keycode);
      hotkeyvalue = (int)e.keycode;
    }
  }
  if (hotkeyvalue == 0)
    hotkeyvalue = -1;
  textbox txthotkey = (textbox)sender;
  txthotkey.text = hotkeystring;
  txthotkey.tag = hotkeyvalue;
  txthotkey.selectionstart = txthotkey.text.length;
}
///
/// 将按键转换成相应字符
///
/// 按键
/// 字符
private string keycodetostring(keys keycode)
{
  if (keycode >= keys.d0 && keycode <= keys.d9)
  {
    return keycode.tostring().remove(0, 1);
  }
  else if (keycode >= keys.numpad0 && keycode <= keys.numpad9)
  {
    return keycode.tostring().replace("pad", "");
  }
  else
  {
    return keycode.tostring();
  }
}
///
/// 设置按键不响应
///
private void txthotkey_keypress(object sender, keypresseventargs e)
{
  e.handled = true;
}
///
/// 释放按键后,若是无实际功能键,则置无
///
private void txthotkey_keyup(object sender, keyeventargs e)
{
  checkhotkey(sender);
}
///
/// 失去焦点后,若是无实际功能键,则置无
///
private void txthotkey_lostfocus(object sender, eventargs e)
{
  checkhotkey(sender);
}
///
/// 检查是否无实际功能键,是则置无
///
private void checkhotkey(object sender)
{
  textbox txthotkey = (textbox)sender;
  if (txthotkey.text.endswith(" + ") || string.isnullorempty(txthotkey.text))
  {
    txthotkey.text = "无";
    txthotkey.tag = -1;
    txthotkey.selectionstart = txthotkey.text.length;
  }
}

#endregion 

#实现快捷键(系统热键)响应

在应用中,我们可能会需要实现像ctrl+c复制、ctrl+v粘贴这样的快捷键,本文简单介绍了它的实现,并给出了一个实现类。

(1)建立一个类文件,命名为hotkey.cs,代码如下:

using system;
using system.collections.generic;
using system.runtime.interopservices;
using system.windows.forms;
namespace koalastudio.bookshopmanager
{
  class hotkey
  {
    //如果函数执行成功,返回值不为0。
    //如果函数执行失败,返回值为0。要得到扩展错误信息,调用getlasterror。
    [dllimport("user32.dll", setlasterror = true)]
    public static extern bool registerhotkey(
      intptr hwnd,        //要定义热键的窗口的句柄
      int id,           //定义热键id(不能与其它id重复)      
      keymodifiers fsmodifiers,  //标识热键是否在按alt、ctrl、shift、windows等键时才会生效
      keys vk           //定义热键的内容
      );
    [dllimport("user32.dll", setlasterror = true)]
    public static extern bool unregisterhotkey(
      intptr hwnd,        //要取消热键的窗口的句柄
      int id           //要取消热键的id
      );
    //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
    [flags()]
    public enum keymodifiers
    {
      none = 0,
      alt = 1,
      ctrl = 2,
      shift = 4,
      windowskey = 8
    }
  }
}

简单说明一下:

“public static extern bool registerhotkey()”这个函数用于注册热键。由于这个函数需要引用user32.dll动态链接库后才能使用,并且

user32.dll是非托管代码,不能用命名空间的方式直接引用,所以需要用“dllimport”进行引入后才能使用。于是在函数前面需要加上

“[dllimport("user32.dll", setlasterror = true)]”这行语句。

“public static extern bool unregisterhotkey()”这个函数用于注销热键,同理也需要用dllimport引用user32.dll后才能使用。

“public enum keymodifiers{}”定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。这样在调用时我们不必记住每一个辅

助键的代码而只需直接选择其名称即可。

(2)以窗体forma为例,介绍hotkey类的使用

在forma的activate事件中注册热键,本例中注册shift+s,ctrl+z,alt+d这三个热键。这里的id号可任意设置,但要保证不被重复。

private void form_activated(object sender, eventargs e)
{
  //注册热键shift+s,id号为100。hotkey.keymodifiers.shift也可以直接使用数字4来表示。
  hotkey.registerhotkey(handle, 100, hotkey.keymodifiers.shift, keys.s);
  //注册热键ctrl+b,id号为101。hotkey.keymodifiers.ctrl也可以直接使用数字2来表示。
  hotkey.registerhotkey(handle, 101, hotkey.keymodifiers.ctrl, keys.b);
  //注册热键alt+d,id号为102。hotkey.keymodifiers.alt也可以直接使用数字1来表示。
  hotkey.registerhotkey(handle, 102, hotkey.keymodifiers.alt, keys.d);
}

在forma的leave事件中注销热键。

private void frmsale_leave(object sender, eventargs e)
{
  //注销id号为100的热键设定
  hotkey.unregisterhotkey(handle, 100);
  //注销id号为101的热键设定
  hotkey.unregisterhotkey(handle, 101);// http://ike.126.com
  //注销id号为102的热键设定
  hotkey.unregisterhotkey(handle, 102);
}

重载froma中的wndproc函数

/// 
/// 监视windows消息
/// 重载wndproc方法,用于实现热键响应
/// 
/// 
protected override void wndproc(ref message m)
{
  const int wm_hotkey = 0x0312;
  //按快捷键 
  switch (m.msg)
  {
    case wm_hotkey:
      switch (m.wparam.toint32())
      {
        case 100:  //按下的是shift+s
          //此处填写快捷键响应代码     
          break;
        case 101:  //按下的是ctrl+b
          //此处填写快捷键响应代码
          break;
        case 102:  //按下的是alt+d
          //此处填写快捷键响应代码
          break;
      }
    break;
  }
  base.wndproc(ref m);
}

完成代码后,我们在窗体中按下shift+s、ctrl+b、alt+d这三组快捷键中的任意一组时,程序都会做出响应的反应。

以上内容是小编给大家介绍的c# winform快捷键设置技巧,希望大家喜欢。