C#注册全局热键

转载 2008年09月24日 20:31:00

注册全局热键要用到Windows的API方法RegisterHotKey和UnregisterHotKey。
一、声明注册热键方法

  1. [DllImport("user32.dll")]
  2.  private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
  3.  [DllImport("user32.dll")]
  4.  private static extern int UnregisterHotKey(IntPtr hwnd, int id);
  5.  int Space = 32; //热键ID
  6.  private const int WM_HOTKEY = 0x312; //窗口消息-热键
  7.  private const int WM_CREATE = 0x1; //窗口消息-创建
  8.  private const int WM_DESTROY = 0x2; //窗口消息-销毁
  9.  private const int MOD_ALT = 0x1; //ALT
  10.  private const int MOD_CONTROL = 0x2; //CTRL
  11.  private const int MOD_SHIFT = 0x4; //SHIFT
  12.  private const int VK_SPACE = 0x20; //SPACE

二、注册热键方法

  1. /// <summary>
  2. /// 注册热键
  3. /// </summary>
  4. /// <param name="hwnd">窗口句柄</param>
  5. /// <param name="hotKey_id">热键ID</param>
  6. /// <param name="fsModifiers">组合键</param>
  7. /// <param name="vk">热键</param>
  8. private void RegKey(IntPtr hwnd, int hotKey_id, int fsModifiers, int vk)
  9. {
  10.      bool result;
  11.      if (RegisterHotKey(hwnd,hotKey_id,fsModifiers,vk) == 0)
  12.      {
  13.          result = false;
  14.      }
  15.      else
  16.      {
  17.          result = true;
  18.      }
  19.      if (!result)
  20.      {
  21.          MessageBox.Show("注册热键失败!");
  22.      }
  23. }
  24. /// <summary>
  25. /// 注销热键
  26. /// </summary>
  27. /// <param name="hwnd">窗口句柄</param>
  28. /// <param name="hotKey_id">热键ID</param>
  29. private void UnRegKey(IntPtr hwnd, int hotKey_id)
  30. {
  31.      UnregisterHotKey(hwnd,hotKey_id);
  32. }

三、重写WndProc方法,实现注册

  1. protected override void WndProc(ref Message m)
  2. {
  3.      base.WndProc(ref m);
  4.      switch(m.Msg)
  5.      {
  6.          case WM_HOTKEY: //窗口消息-热键
  7.              switch(m.WParam.ToInt32())
  8.              {
  9.                  case 32: //热键ID
  10.                      MessageBox.Show("Hot Key : Ctrl + Alt + Shift + Space");
  11.                  break;
  12.                  default:
  13.                  break;
  14.              }
  15.          break;
  16.          case WM_CREATE: //窗口消息-创建
  17.              RegKey(Handle,Space,MOD_ALT | MOD_CONTROL | MOD_SHIFT,VK_SPACE); //注册热键
  18.          break;
  19.          case WM_DESTROY: //窗口消息-销毁
  20.              UnRegKey(Handle,Space); //销毁热键
  21.          break;
  22.          default:
  23.          break;
  24.      }
  25. }

附:虚拟键值表
{ Virtual Keys, Standard Set }
{$EXTERNALSYM VK_LBUTTON}
VK_LBUTTON = 1;
{$EXTERNALSYM VK_RBUTTON}
VK_RBUTTON = 2;
{$EXTERNALSYM VK_CANCEL}
VK_CANCEL = 3;
{$EXTERNALSYM VK_MBUTTON}
VK_MBUTTON = 4; { NOT contiguous with L & RBUTTON }
{$EXTERNALSYM VK_BACK}
VK_BACK = 8;
{$EXTERNALSYM VK_TAB}
VK_TAB = 9;
{$EXTERNALSYM VK_CLEAR}
VK_CLEAR = 12;
{$EXTERNALSYM VK_RETURN}
VK_RETURN = 13;
{$EXTERNALSYM VK_SHIFT}
VK_SHIFT = $10;
{$EXTERNALSYM VK_CONTROL}
VK_CONTROL = 17;
{$EXTERNALSYM VK_MENU}
VK_MENU = 18;
{$EXTERNALSYM VK_PAUSE}
VK_PAUSE = 19;
{$EXTERNALSYM VK_CAPITAL}
VK_CAPITAL = 20;
{$EXTERNALSYM VK_KANA }
VK_KANA = 21;
{$EXTERNALSYM VK_HANGUL }
VK_HANGUL = 21;
{$EXTERNALSYM VK_JUNJA }
VK_JUNJA = 23;
{$EXTERNALSYM VK_FINAL }
VK_FINAL = 24;
{$EXTERNALSYM VK_HANJA }
VK_HANJA = 25;
{$EXTERNALSYM VK_KANJI }
VK_KANJI = 25;
{$EXTERNALSYM VK_CONVERT }
VK_CONVERT = 28;
{$EXTERNALSYM VK_NONCONVERT }
VK_NONCONVERT = 29;
{$EXTERNALSYM VK_ACCEPT }
VK_ACCEPT = 30;
{$EXTERNALSYM VK_MODECHANGE }
VK_MODECHANGE = 31;
{$EXTERNALSYM VK_ESCAPE}
VK_ESCAPE = 27;
{$EXTERNALSYM VK_SPACE}
VK_SPACE = $20;
{$EXTERNALSYM VK_PRIOR}
VK_PRIOR = 33;
{$EXTERNALSYM VK_NEXT}
VK_NEXT = 34;
{$EXTERNALSYM VK_END}
VK_END = 35;
{$EXTERNALSYM VK_HOME}
VK_HOME = 36;
{$EXTERNALSYM VK_LEFT}
VK_LEFT = 37;
{$EXTERNALSYM VK_UP}
VK_UP = 38;
{$EXTERNALSYM VK_RIGHT}
VK_RIGHT = 39;
{$EXTERNALSYM VK_DOWN}
VK_DOWN = 40;
{$EXTERNALSYM VK_SELECT}
VK_SELECT = 41;
{$EXTERNALSYM VK_PRINT}
VK_PRINT = 42;
{$EXTERNALSYM VK_EXECUTE}
VK_EXECUTE = 43;
{$EXTERNALSYM VK_SNAPSHOT}
VK_SNAPSHOT = 44;
{$EXTERNALSYM VK_INSERT}
VK_INSERT = 45;
{$EXTERNALSYM VK_DELETE}
VK_DELETE = 46;
{$EXTERNALSYM VK_HELP}
VK_HELP = 47;
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
{$EXTERNALSYM VK_LWIN}
VK_LWIN = 91;
{$EXTERNALSYM VK_RWIN}
VK_RWIN = 92;
{$EXTERNALSYM VK_APPS}
VK_APPS = 93;
{$EXTERNALSYM VK_NUMPAD0}
VK_NUMPAD0 = 96;
{$EXTERNALSYM VK_NUMPAD1}
VK_NUMPAD1 = 97;
{$EXTERNALSYM VK_NUMPAD2}
VK_NUMPAD2 = 98;
{$EXTERNALSYM VK_NUMPAD3}
VK_NUMPAD3 = 99;
{$EXTERNALSYM VK_NUMPAD4}
VK_NUMPAD4 = 100;
{$EXTERNALSYM VK_NUMPAD5}
VK_NUMPAD5 = 101;
{$EXTERNALSYM VK_NUMPAD6}
VK_NUMPAD6 = 102;
{$EXTERNALSYM VK_NUMPAD7}
VK_NUMPAD7 = 103;
{$EXTERNALSYM VK_NUMPAD8}
VK_NUMPAD8 = 104;
{$EXTERNALSYM VK_NUMPAD9}
VK_NUMPAD9 = 105;
{$EXTERNALSYM VK_MULTIPLY}
VK_MULTIPLY = 106;
{$EXTERNALSYM VK_ADD}
VK_ADD = 107;
{$EXTERNALSYM VK_SEPARATOR}
VK_SEPARATOR = 108;
{$EXTERNALSYM VK_SUBTRACT}
VK_SUBTRACT = 109;
{$EXTERNALSYM VK_DECIMAL}
VK_DECIMAL = 110;
{$EXTERNALSYM VK_DIVIDE}
VK_DIVIDE = 111;
{$EXTERNALSYM VK_F1}
VK_F1 = 112;
{$EXTERNALSYM VK_F2}
VK_F2 = 113;
{$EXTERNALSYM VK_F3}
VK_F3 = 114;
{$EXTERNALSYM VK_F4}
VK_F4 = 115;
{$EXTERNALSYM VK_F5}
VK_F5 = 116;
{$EXTERNALSYM VK_F6}
VK_F6 = 117;
{$EXTERNALSYM VK_F7}
VK_F7 = 118;
{$EXTERNALSYM VK_F8}
VK_F8 = 119;
{$EXTERNALSYM VK_F9}
VK_F9 = 120;
{$EXTERNALSYM VK_F10}
VK_F10 = 121;
{$EXTERNALSYM VK_F11}
VK_F11 = 122;
{$EXTERNALSYM VK_F12}
VK_F12 = 123;
{$EXTERNALSYM VK_F13}
VK_F13 = 124;
{$EXTERNALSYM VK_F14}
VK_F14 = 125;
{$EXTERNALSYM VK_F15}
VK_F15 = 126;
{$EXTERNALSYM VK_F16}
VK_F16 = 127;
{$EXTERNALSYM VK_F17}
VK_F17 = 128;
{$EXTERNALSYM VK_F18}
VK_F18 = 129;
{$EXTERNALSYM VK_F19}
VK_F19 = 130;
{$EXTERNALSYM VK_F20}
VK_F20 = 131;
{$EXTERNALSYM VK_F21}
VK_F21 = 132;
{$EXTERNALSYM VK_F22}
VK_F22 = 133;
{$EXTERNALSYM VK_F23}
VK_F23 = 134;
{$EXTERNALSYM VK_F24}
VK_F24 = 135;
{$EXTERNALSYM VK_NUMLOCK}
VK_NUMLOCK = 144;
{$EXTERNALSYM VK_SCROLL}
VK_SCROLL = 145;
{ VK_L & VK_R - left and right Alt, Ctrl and Shift virtual keys.
Used only as parameters to GetAsyncKeyState() and GetKeyState().
No other API or message will distinguish left and right keys in this way. }
{$EXTERNALSYM VK_LSHIFT}
VK_LSHIFT = 160;

C#中调用API函数RegisterHotKey注册多个系统热键

转自:http://www.kkee.cn/article.asp?id=84 要设置快捷键必须使用user32.dll下面的两个方法。 BOOL RegisterHotKey( //注册系统热键的A...
  • forlinux
  • forlinux
  • 2006年08月28日 14:39
  • 4139

C#为应用程序注册快捷键

在应用中,我们可能会需要实现像Ctrl+C复制、Ctrl+V粘贴这样的快捷键,本文简单介绍了它的实现,并给出了一个实现类。(1)建立一个类文件,命名为HotKey.cs,代码如下:using Syst...
  • ismycxp
  • ismycxp
  • 2007年07月19日 14:56
  • 3324

Ruby_04_常见对象

Ruby 字符串(String)Ruby 中的 String 对象存储并操作一个或多个字节的任意序列,通常表示那些代表人类语言的字符。最简单的字符串是括在单引号(单引号字符)内。在引号标记内的文本是字...
  • u012576807
  • u012576807
  • 2018年02月21日 15:41
  • 43

C#注册和注销全局快捷键

在使用酷狗听歌的时候,我们可以不打开酷狗程序,直接使用组合键(Ctrl + Alt + 上)增加音量,使用(Ctrl + Alt + 右)切换到下一曲 如何在C#代码中实现这样全局快捷键呢 ...
  • qq798833488
  • qq798833488
  • 2016年11月09日 00:39
  • 766

c# RegHotKey类,写窗口程序,注册全局热键更方便。

c#注册全局热键类。使用简单,快速高效。
  • xinje
  • xinje
  • 2014年02月15日 12:23
  • 1695

C# 如何实现热键注册 RegisterHotKey

RegisterHotKey(this.Handle, 247696411, 0, (UInt32)Keys.***); http://baike.baidu.com/view/1080084....
  • qq798833488
  • qq798833488
  • 2016年11月09日 01:24
  • 1613

WinForm 如何注册热键?

 Q:WinForm 如何注册热键?A:using   System; using   System.Collections.Generic; using   System.ComponentMode...
  • jinjazz
  • jinjazz
  • 2007年11月15日 00:57
  • 2405

c#注册全局快捷键

早上一来看到园子里有篇文章是说注册快捷键,一看用的是hook,好多的代码,下面是我以前用的代码:using System;using System.Runtime.InteropServices;na...
  • sohighthesky
  • sohighthesky
  • 2010年05月20日 09:48
  • 2515

C#全局热键设置与窗体热键设置实例

1、窗体热键 首先要设置主窗体KeyPreview为true,可直接在属性中进行设置, 或者在窗体加载中设置: this.KeyPreview = true; 然后添加窗体KeyDown事件,如...
  • cuoban
  • cuoban
  • 2016年02月26日 16:16
  • 3652

C#全局热键

  • 2012年04月01日 17:23
  • 41KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#注册全局热键
举报原因:
原因补充:

(最多只允许输入30个字)