在程序失去焦点或者在后台运行时,可以通过使用全局热键的方式,进行一些快捷的操作,如QQ默认操作中ctrl+alt+A调出截图功能。
在Windows中实现热键功能需要使用win32的Api函数RegisterHotKey和UnregisterHotKey。
实现代码:
一、注册热键:
public class HotKey
{
//============= 1、声明注册热键的方法 ==================
[DllImport("user32.dll", EntryPoint = "RegisterHotKey")]
private static extern int RegisterHotKey(IntPtr hWnd, int nID, int nModifiers, int nVK); [DllImport("user32.dll", EntryPoint = "RegisterHotKey")]
private static extern int RegisterHotKey(IntPtr hWnd, int nID, int nModifiers, Keys VK); [DllImport("user32.dll", EntryPoint = "UnregisterHotKey")]
private static extern int UnregisterHotKey(IntPtr hWnd, int nID); //============= 2、声明组合键常量 ========================
public const int MOD_NONE = ;
public const int MOD_ALT = ;
public const int MOD_CTRL = ;
public const int MOD_SHIFT = ; public enum MOD
{
MOD_NONE = ,
MOD_ALT = ,
MOD_CTRL = ,
MOD_SHIFT = ,
MOD_WIN =
} //============= 3、实现注册热键的方法 ==================== /// <summary>
/// 注册热键
/// </summary>
/// <param name="hWnd">窗口句柄</param>
/// <param name="nID">热键标识</param>
/// <param name="modKey">组合键</param>
/// <param name="nVK">热键</param>
/// <returns></returns>
public static bool RegHotKey(IntPtr hWnd, int nID, int modKey, int nVK)
{
//========== 3.1、先释放该窗口句柄下具有相同标识的热键 =============
UnregisterHotKey(hWnd, nID); //========== 3.2、注册热键 =========================================
int nResult = RegisterHotKey(hWnd, nID, modKey, nVK); //========== 3.3、返回注册结果 =====================================
return nResult != ? true : false;
}
注册热键
二、在调用热键的窗口程序中,重写WndProc方法响应热键:
private const int nHotKeyID = 0xabcd; //热键标识
/// <summary>
/// 重写WndProc响应热键方法
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
switch (m.WParam.ToInt32())
{
case nHotKeyID:
Method(); //热键调用的方法
break;
} base.WndProc(ref m);
}
响应热键
全局热键的注册工作完成,还有一些需要注意的方面:
1、关于定义热键的标识符,引用程序必须定义一个0X0000-0xBFFF范围的值;
2、经测试,F12键无法进行注册,有可能是系统占用。(如有误,还请路过的高手指教);