路过秋天

同样的3年,有的人从学生到当了MVP了,而我却在原地,卖弄当年的代码,秋天的风,有点凄,有点凉!

公告信息
内涵是很强大的~~~别看外表~~~当犀利哥入侵不了的时候,感觉有种莫名的失落~~~
文章档案
最新评论

C#老板键多组合Alt+Ctrl+Shift代码实现


今天给大伙分享一下C#老板键多组合Alt+Ctrl+Shift代码实现,这是一个简单的实现,不过网上多数的代码都是重复的,这里其实也是重复的,只是发现其中的一些不为人知的隐藏属性:

下面看一下最常见的代码:

public delegate void HotkeyEventHandler(int HotKeyID);

    public class SystemHotKey : System.Windows.Forms.IMessageFilter
    {
        List<UInt32> keyIDs = new List<UInt32>();
        IntPtr hWnd;

        public event HotkeyEventHandler OnHotkey;

        public enum KeyFlags
        {
            Alt = 0x1,
            Ctrl = 0x2,
            Shift = 0x4,
            Win = 0x8,
            //组合键等于值相加
            Alt_Ctrl = 0x3,
            Alt_Shift = 0x5,
            Ctrl_Shift = 0x6,
            Alt_Ctrl_Shift = 0x7
        }
        [DllImport("user32.dll")]
        public static extern UInt32 RegisterHotKey(IntPtr hWnd, UInt32 id, UInt32 fsModifiers, UInt32 vk);

        [DllImport("user32.dll")]
        public static extern UInt32 UnregisterHotKey(IntPtr hWnd, UInt32 id);

        [DllImport("kernel32.dll")]
        public static extern UInt32 GlobalAddAtom(String lpString);

        [DllImport("kernel32.dll")]
        public static extern UInt32 GlobalDeleteAtom(UInt32 nAtom);

        public SystemHotKey(IntPtr hWnd)
        {
            this.hWnd = hWnd;
        }

        public int RegisterHotkey(KeyFlags keyflags, System.Windows.Forms.Keys Key)
        {
            System.Windows.Forms.Application.AddMessageFilter(this);
            UInt32 hotkeyid = GlobalAddAtom(System.Guid.NewGuid().ToString());
            RegisterHotKey((IntPtr)hWnd, hotkeyid, (UInt32)keyflags, (UInt32)Key);
            keyIDs.Add(hotkeyid);
            return (int)hotkeyid;
        }

        public void UnregisterHotkeys()
        {
            if (keyIDs.Count > 0)
            {

                System.Windows.Forms.Application.RemoveMessageFilter(this);
                foreach (UInt32 key in keyIDs)
                {
                    UnregisterHotKey(hWnd, key);
                    GlobalDeleteAtom(key);
                }
                keyIDs.Clear();
            }
        }

        public bool PreFilterMessage(ref   System.Windows.Forms.Message m)
        {
            if (m.Msg == 0x312)
            {
                if (OnHotkey != null)
                {
                    foreach (UInt32 key in keyIDs)
                    {
                        if ((UInt32)m.WParam == key)
                        {
                            OnHotkey((int)m.WParam);
                            return true;
                        }
                    }
                }
            }
            return false;
        }
    }

这段是我经过改篇的代码,其中有几个小修改要点说一下:

1:System.Windows.Forms.Application.AddMessageFilter(this);这句需要对应System.Windows.Forms.Application.RemoveMessageFilter(this);这里用完要记得取消。
由于原来的程序,只在构造函数里添加,所以取消后,再设置就会失效了,这里直接在注册的时候给加上,取消时去掉,注意下这个效果即可。

2:热键的组合:
            //组合键等于值相加
            Alt_Ctrl = 0x3,
            Alt_Shift = 0x5,
            Ctrl_Shift = 0x6,
            Alt_Ctrl_Shift = 0x7
这个是我发现的,网上的代码几乎都没有写到,搜了半天也没有组合键相关的介绍,后来我试了一下,果然组合键就是值相加,就这么简单。

3:把Hastable变更成List<Unint32>方式。

秋色园是QBlog的官方站点,由路过秋天创建,基于cyqdata数据层框架开发的支持多用户、多语言、多数据库(access,mssql,oracle)、目录级url等功能强大的博客系统
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"

2012/1/22 1:28:14 | C# Winform基础 | |

#1蝗虫的大腿[124.207.26.*]2012/2/9 9:31:20
测试一下.貌似不错
  • 发表评论