zoukankan      html  css  js  c++  java
  • Winform 多组合老板键Alt_Ctrl_Shift

    某天,为了给微博粉丝精灵增加个老板键功能,找一惯的方式,开始从网络下手寻找: 关键字类似”C# 老板键“,一搜,一堆又一堆,然而出来的代码,基本上都是一个样的:

    正常来说,老板键一般少不了:Alt+Ctrl+Shift+XX这种多组合方式,然而各类代码就是不直接说明,也没个提示,看来是有意隐藏,终于,还是被我发现其中的一些不为人知的隐藏属性:

    下面看一下本人修改自网络常见的代码:
    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>方式。

    最近事比较多,写文都比较简单了,大伙见谅了。 

  • 相关阅读:
    Java——class对象
    Java——HashSet和TreeSet的区别
    Java——普通数据类型转化为String
    Java——Iterator迭代器
    Java——ArrayList和LinkedList的区别(转)
    Java——警告消除
    Object类——toString
    Java——动态调用类中方法
    SharePoint使用jsom查询当前用户信息
    SharePoint列表模板(.stp)
  • 原文地址:https://www.cnblogs.com/cyq1162/p/2355679.html
Copyright © 2011-2022 走看看