最近研究热键枚举,稍微总结一下,以后继续补充:

Winform程序全局热键

Winform程序全局热键一般采取的是,调用windows api的情势,主要是通过面下的四个函数

            /// <summary> /// 如果函数行执胜利,回返值不为0。 /// 如果函数行执失败,回返值为0。要失掉扩展错误信息,调用GetLastError。.NET方法:Marshal.GetLastWin32Error() /// </summary> /// <param name="hWnd">要定义热键的口窗的句柄</param> /// <param name="id">定义热键ID(不能与其它ID复重) </param> /// <param name="fsModifiers">识标热键否是在按Alt、Ctrl、Shift、Windows等键时才会效生</param> /// <param name="vk">定义热键的内容,WinForm中可以应用Keys枚举转换, /// WPF中Key枚举是不确正的,应当应用System.Windows.Forms.Keys枚举,或者自定义确正的枚举或int常量</param> /// <returns></returns> [DllImport("user32.dll", SetLastError = true)]public static extern bool RegisterHotKey(IntPtr hWnd,UInt32 id,UInt32 fsModifiers,UInt32 vk);

/// <summary>             /// 取消册注热键             /// </summary>             /// <param name="hWnd">要取消热键的口窗的句柄</param>             /// <param name="id">要取消热键的ID</param>             /// <returns></returns>             [DllImport("user32.dll", SetLastError = true)]             public static extern bool UnregisterHotKey(             IntPtr hWnd,             UInt32 id             );

/// <summary>             /// 向全局子原表添加一个符字串,并回返这个符字串的一唯识标符,胜利则回返值为新创建的子原ID,失败回返0             /// </summary>             /// <param name="lpString"></param>             /// <returns></returns>             [DllImport("kernel32", SetLastError = true)]             public static extern UInt32 GlobalAddAtom(string lpString);

/// <summary>             /// 从全局子原表删除指定一个符字串,并回返这个符字串的一唯识标符,失败回返0             /// </summary>             /// <param name="nAtom"></param>             /// <returns></returns>             [DllImport("kernel32", SetLastError = true)]             public static extern UInt32 GlobalDeleteAtom(UInt32 nAtom);

还有一个帮助类,志标户用否是册注了含有win ctrl shift等特别键的快捷式方

/// <summary> /// 定义了帮助键的名称(将数字转变为符字以便于记忆,也可去除此枚举而直接应用数值) /// </summary>public enum KeyFlags{MOD_NONE = 0x0,MOD_ALT = 0x1,MOD_CONTROL = 0x2,MOD_SHIFT = 0x4,MOD_WIN = 0x8}

贴上部全代码:

每日一道理
父亲对于儿子来说,是座耸立的高山,而儿子只是颗石子,源于山,却并不了解山。生活中诸多爱的密码,是需用细节来解读的,在亲情的沃土上,要想搞得最美的果实,惟有期待那存在于瞬间的心与心的共鸣,爱与爱的默契。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Collections;namespace luolunz
{public delegate void HotkeyEventHandler(int hotKeyID);public class HotkeyHelper : IMessageFilter{public event HotkeyEventHandler OnHotkey;public enum KeyFlags{MOD_NONE=0x0,MOD_ALT = 0x1,MOD_CONTROL = 0x2,MOD_SHIFT = 0x4,MOD_WIN = 0x8   }class NativeMethods{private NativeMethods() { }#region WIN32 API/// <summary> /// 如果函数行执胜利,回返值不为0。 /// 如果函数行执失败,回返值为0。要失掉扩展错误信息,调用GetLastError。.NET方法:Marshal.GetLastWin32Error() /// </summary> /// <param name="hWnd">要定义热键的口窗的句柄</param> /// <param name="id">定义热键ID(不能与其它ID复重) </param> /// <param name="fsModifiers">识标热键否是在按Alt、Ctrl、Shift、Windows等键时才会效生</param> /// <param name="vk">定义热键的内容,WinForm中可以应用Keys枚举转换, /// WPF中Key枚举是不确正的,应当应用System.Windows.Forms.Keys枚举,或者自定义确正的枚举或int常量</param> /// <returns></returns> [DllImport("user32.dll", SetLastError = true)]public static extern bool RegisterHotKey(IntPtr hWnd,UInt32 id,UInt32 fsModifiers,UInt32 vk);/// <summary> /// 取消册注热键 /// </summary> /// <param name="hWnd">要取消热键的口窗的句柄</param> /// <param name="id">要取消热键的ID</param> /// <returns></returns> [DllImport("user32.dll", SetLastError = true)]public static extern bool UnregisterHotKey(IntPtr hWnd,UInt32 id);/// <summary> /// 向全局子原表添加一个符字串,并回返这个符字串的一唯识标符,胜利则回返值为新创建的子原ID,失败回返0 /// </summary> /// <param name="lpString"></param> /// <returns></returns> [DllImport("kernel32", SetLastError = true)]public static extern UInt32 GlobalAddAtom(string lpString);/// <summary>/// 从全局子原表删除指定一个符字串,并回返这个符字串的一唯识标符,失败回返0/// </summary>/// <param name="nAtom"></param>/// <returns></returns>[DllImport("kernel32", SetLastError = true)]public static extern UInt32 GlobalDeleteAtom(UInt32 nAtom);/// <summary> /// 定义了帮助键的名称(将数字转变为符字以便于记忆,也可去除此枚举而直接应用数值) /// </summary>public enum KeyFlags{MOD_NONE = 0x0,MOD_ALT = 0x1,MOD_CONTROL = 0x2,MOD_SHIFT = 0x4,MOD_WIN = 0x8}#endregion}Hashtable keyIDs = new Hashtable();IntPtr hWnd;public HotkeyHelper(IntPtr hWnd){this.hWnd = hWnd;Application.AddMessageFilter(this);}public UInt32RegisterHotkey(Keys Key, KeyFlags keyflags){UInt32 hotkeyid = NativeMethods.GlobalAddAtom(System.Guid.NewGuid().ToString());NativeMethods.RegisterHotKey((IntPtr)hWnd, hotkeyid, (UInt32)keyflags, (UInt32)Key);keyIDs.Add(hotkeyid, hotkeyid);return (UInt32)hotkeyid;}public void UnregisterHotkeys(){Application.RemoveMessageFilter(this);foreach (UInt32 key in keyIDs.Values){NativeMethods.UnregisterHotKey(hWnd, key);NativeMethods.GlobalDeleteAtom(key);}}public bool PreFilterMessage(ref Message m){if (m.Msg == 0x312){if (OnHotkey != null){foreach (UInt32 key in keyIDs.Values){if ((UInt32)m.WParam == key){OnHotkey((int)m.WParam);return true;}}}}return false;}}
}

应用式方:

HotkeyHelper HotkeyHelper { set; get; }UInt32 CONTROR_F;UInt32 CONTROR_G;UInt32 F10;HotkeyHelper = new HotkeyHelper(this.Handle);CONTROR_F = HotkeyHelper.RegisterHotkey(Keys.F, HotkeyHelper.KeyFlags.MOD_CONTROL | HotkeyHelper.KeyFlags.MOD_SHIFT);CONTROR_G = HotkeyHelper.RegisterHotkey(Keys.G, HotkeyHelper.KeyFlags.MOD_CONTROL);F10 = HotkeyHelper.RegisterHotkey(Keys.F10, 0);HotkeyHelper.OnHotkey += new HotkeyEventHandler(OnHotkey);private void OnHotkey(int hotkeyID){if (hotkeyID == CONTROR_F){//do somethingMessageBox.Show("CONTROR_SHIT_F");}else if (hotkeyID == F10){//do something elseMessageBox.Show("F10");}}

局部热键(盘键快捷键的捕获)

/// <summary>/// 户用盘键快捷键取获与处置/// </summary>/// <param name="msg"></param>/// <param name="keyData"></param>/// <returns></returns>protected override bool ProcessCmdKey(ref Message msg, Keys keyData){KeyEventArgs e = new KeyEventArgs(keyData);if (keyData == (Keys.Alt | Keys.P)){//do something
}if (keyData == (Keys.Alt | Keys.C)){//do something
}if (keyData == (Keys.Alt | Keys.A)){//do something
}if (keyData == (Keys.Alt | Keys.Z)){//do something
}if (keyData == (Keys.F1)){//do something
}if (keyData == (Keys.F3)){//do something
}return true;}

文章结束给大家分享下程序员的一些笑话语录: 问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?  
  答:因为李艳红这种败类,所以我没女友!

转载于:https://www.cnblogs.com/jiangu66/archive/2013/04/26/3045627.html

热键枚举Winform程序全局热键与局部热键(键盘快捷键的捕获)相关推荐

  1. Windows 技术篇-最新win10系统下查看热键被哪个程序占用,windows10系统查看占用快捷键的所有程序

    之前 2011 年的时候有款 Windows Hotkey Explorer 工具,windows7 64 位使用还行,如果使用 windows10.或者是 windows7 32 位的,会把所有快捷 ...

  2. Web是新的终端:您是否正在使用Web的键盘快捷键和热键?

    NUI is OUI, Dear Reader. About eight years ago I blogged about "text mode" and said (if I ...

  3. 程序全局热键_如何在Linux下将全局热键绑定到WINE程序

    程序全局热键 Have you ever installed a Windows program in Linux under WINE, only to discover that it doesn ...

  4. vb按热键启动应用程序

    '模块声明 : ' 模块声明 Option Explicit Declare Function SetWindowLong Lib "user32" Alias "Set ...

  5. winform程序捕获全局异常,对错误信息写入日志并弹窗

    使用场景:在winform程序中如果没对方法进行try catch操作,若方法内出错,则整个程序报错并退出,如下图 如果程序已在客户手中,若没对错误的详细信息进行拍照,我们则不知道错误原因是什么.我们 ...

  6. winform程序读取和改写配置文件App.config元素的值

    在开发Web项目的时候,会有一个配置文件Web.config,用来存放一些全局的变量,如连接数据库用的字符串.相应的,在开发winform程序时,也有一个配置文件,它就是App.config,这个文件 ...

  7. Vue组件之全局组件与局部组件

    组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下, ...

  8. 16-作用域(全局作用域及局部作用域)

    16-作用域(全局作用域及局部作用域) //作用域 全局作用域 函数作用域 //函数的内部环境可以访问到所有外部环境的值,但是外部环境不能访问内部环境的值 //注意事项 //在全局变量和局部变量不同名 ...

  9. python 3.28 第三章 函数嵌套/名称空间//内置名称空间/全局名称空间/局部名称空间/作用域/函数对象/闭包函数。...

    1 函数嵌套: 函数内可以调用了其他的函数. # def max2(x,y):# if x > y:# return x# else:# return y## def max3(x,y,z):# ...

最新文章

  1. 时频特性分析(Matlab)
  2. jquery的一个代码
  3. 谷歌guava_Google Guava:您永远不会知道的5件事
  4. java配置opencv_在Windows中使用OpenCV Java与Eclipse
  5. Java程序员校招蚂蚁金服,大专生出身,做Java程序员真的没有春天吗
  6. Google Reader 使用技巧及OPML订阅源分享
  7. matlab cos sinx,matlab求y=sinxcos(2x)及其包络线急!!!
  8. 日文简历 模板
  9. linux汉诺塔实验报告,汉诺塔问题实验报告
  10. 毕业论文 - 写作问题总结 和 tips
  11. Java设计模式:单例模式的7种实现
  12. FPGA抗辐射加固方法
  13. sudo rm -f /
  14. 电子信息工程求职目标_实用的信息工程专业求职信四篇
  15. 海思Hi351X相关
  16. win10WLAN选项消失解决方法
  17. 怎么做好电商运营?40份电商运营表格模板,你离优秀的运营只差了一个表格
  18. 相机CCD尺寸的大小详细列表
  19. 宝塔linux shell定时访问url,bt(宝塔)面板添加shell 脚本通过nginx日志封访问频率过高的IP...
  20. python交通流预测算法_基于机器学习的交通流预测技术的研究与应用

热门文章

  1. 堆(heap)与栈(stack)的区别(二)
  2. I2C,485,232,spi区别以半双工,全双工
  3. opencv-python图像处理之素描
  4. python语音处理工具
  5. easyopen原理解析——不到100行代码实现一个最精简的easyopen
  6. 26.SpringBoot事务注解详解
  7. 阿里云胡晓明:未来5-10年将和中国移动互为生态
  8. 如何证明你的性能测试结果可信?
  9. javaweb中为mysql的curd多个值的语句
  10. 如何挑选适合的前端框架(去哪儿网前端架构师司徒正美)