首页 > 技术文章 > winform接收全局的快捷键

mengxingxinqing 2014-06-15 22:50 原文

public class NativeWIN32
    {
        public NativeWIN32()
        { }
        /* ------- using WIN32 Windows API in a C# application ------- */

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static public extern IntPtr GetForegroundWindow(); //

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct STRINGBUFFER
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public string szText;
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER ClassName, int nMaxCount);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);

        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_CLOSE = 0xF060;

        public delegate bool EnumThreadProc(IntPtr hwnd, IntPtr lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool EnumThreadWindows(int threadId, EnumThreadProc pfnEnum, IntPtr lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr next, string sClassName, IntPtr sWindowTitle);


        /* ------- using HOTKEYs in a C# application -------
 
        in form load :
         bool success = RegisterHotKey(Handle, 100,     KeyModifiers.Control | KeyModifiers.Shift, Keys.J);
 
        in form closing :
         UnregisterHotKey(Handle, 100);
  
 
        protected override void WndProc( ref Message m )
        { 
         const int WM_HOTKEY = 0x0312;  
   
         switch(m.Msg) 
         { 
          case WM_HOTKEY:  
           MessageBox.Show("Hotkey pressed");  
           break; 
         }  
         base.WndProc(ref m );
        }
 
        ------- using HOTKEYs in a C# application ------- */

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(IntPtr hWnd, // handle to window   
         int id,            // hot key identifier   
         KeyModifiers fsModifiers,  // key-modifier options   
         Keys vk            // virtual-key code   
         );

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(IntPtr hWnd,  // handle to window   
         int id      // hot key identifier   
         );

        [Flags()]
        public enum KeyModifiers
        {
            None = 0,
            Alt = 1,
            Control = 2,
            Shift = 4,
            Windows = 8
        }
    }

在Form中Load事件中首先注册热键

        /// <summary>
        /// 注册热键
        /// </summary>
        /// <param name="c">按键</param>
        /// <param name="bCtrl">是否需要ctrl</param>
        /// <param name="bShift">是否需要shift</param>
        /// <param name="bAlt">是否需要alt</param>
        /// <param name="bWindows">是否需要win</param>
        public void SetHotKey(Keys c, bool bCtrl, bool bShift, bool bAlt, bool bWindows)
        {
            //先赋到变量
            Keys m_key = c;
            bool m_ctrlhotkey = bCtrl;
            bool m_shifthotkey = bShift;
            bool m_althotkey = bAlt;
            bool m_winhotkey = bWindows;

            //注册系统热键
            NativeWIN32.KeyModifiers modifiers = NativeWIN32.KeyModifiers.None;
            if (bCtrl)
                modifiers |= NativeWIN32.KeyModifiers.Control;
            if (bShift)
                modifiers |= NativeWIN32.KeyModifiers.Shift;
            if (bAlt)
                modifiers |= NativeWIN32.KeyModifiers.Alt;
            if (bWindows)
                modifiers |= NativeWIN32.KeyModifiers.Windows;
            NativeWIN32.RegisterHotKey(Handle, 100, modifiers, c);
        }

然后监听消息,处理事件

        /// <summary>
        /// 重写windows消息响应
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            const int wmHotkey = 0x0312;
            switch (m.Msg)
            {
                case wmHotkey:
                    WindowMax();
                    break;
            }
            base.WndProc(ref m);
        }

 

推荐阅读