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>方式。

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

转载于:https://my.oschina.net/secyaher/blog/274174

猜你喜欢

转载自blog.csdn.net/weixin_33946020/article/details/91967056
今日推荐