using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WTest26
{
public static class HotKey
{
[DllImport("user32.dll")]
private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
[DllImport("user32.dll")]
private static extern int UnregisterHotKey(IntPtr hwnd, int id);
public const int WM_HOTKEY = 0x312; //窗口消息-热键
public const int WM_CREATE = 0x1; //窗口消息-创建
public const int WM_DESTROY = 0x2; //窗口消息-销毁
public const int MOD_ALT = 0x1; //ALT
public const int MOD_CONTROL = 0x2; //CTRL
public const int MOD_SHIFT = 0x4; //SHIFT
public const int VK_SPACE = 0x20; //SPACE
/// <summary>
/// 注册热键
/// </summary>
/// <param name="hwnd">窗口句柄</param>
/// <param name="hotKey_id">热键ID</param>
/// <param name="fsModifiers">组合键</param>
/// <param name="vk">热键</param>
public static void RegKey(IntPtr hwnd, int hotKey_id, int fsModifiers, int vk)
{
bool result;
if (RegisterHotKey(hwnd, hotKey_id, fsModifiers, vk) == 0)
{
result = false;
}
else
{
result = true;
}
if (!result)
{
MessageBox.Show("注册热键失败!");
}
}
/// <summary>
/// 注销热键
/// </summary>
/// <param name="hwnd">窗口句柄</param>
/// <param name="hotKey_id">热键ID</param>
public static void UnRegKey(IntPtr hwnd, int hotKey_id)
{
UnregisterHotKey(hwnd, hotKey_id);
}
}
}
注意:
一定要理解注册时使用的4个参数的根据。
后面两个参数好理解一个是Ctrl,Shift,Alt这些功能键是否处理,一个是按下的其它非功能键,比如ABCD之类的。
对于注册时使用的第1个参数,handler这是你用于接收热键消息的窗口句柄,这个固定。
第2个参数是热键的编号,它不一定要等于你要注册的热键的VK码,可以是其它值,只要不与现有的热键编号相同或者冲突即可。否则会导致已有的热键不可用
二,然后是使用上述代码
namespace WTest26
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private const int VK_F1 = 112;
private const int VK_F2 = 113; protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case HotKey.WM_HOTKEY: //窗口消息-热键
switch (m.WParam.ToInt32())
{
case VK_F1: //隐藏热键ID
this.Hide();
break;
case VK_F2: //显示热键ID
this.Show();
break;
default:
break;
}
break;
case HotKey.WM_CREATE: //窗口消息-创建
//注册Ctrl+F1
HotKey.RegKey(Handle, VK_F1, HotKey.MOD_CONTROL,VK_F1);
HotKey.RegKey(Handle, VK_F2, HotKey.MOD_CONTROL,VK_F2);
break;
case HotKey.WM_DESTROY: //窗口消息-销毁
HotKey.UnRegKey(Handle, VK_F1);
HotKey.UnRegKey(Handle, VK_F2);
break;
default:
break;
}
}
}
}说明一下: VK_F1 = 112;并不是Ctrl+F1的键值,而是F1的VK(VirtualKey)值.这个值是固定的(具体的内容可以查MSDN). Ctrl,Shift,Alt这些功能键也有键值,但在这里不需要考虑
.因此从你那的编码的角度,如果你要用shift+ctrl+F1,你需要这样调用: HotKey.RegKey(Handle, VK_F1, HotKey.MOD_CONTROL|HotKey.Mod_SHIFT,VK_F1); 最后面那个参数就是F1
的键值,而前面表示需要组合按下Ctrl,Shift. 另外再提醒一次,第二个参数是表示你的程序在系统里注册热键时所使用的一个"编号",与你使用的热键具体是哪个没有任何关系,你
所唯一需要保证或者说需要注意的就是不要与其它全局热键冲突,否则会导致之前使用这个"编号"的热键失效,也就是你的这个注册覆盖了它之前的注册. 此文主要参考了phy的文章
,特此感谢!