【WinForm程序】注册热键快捷键切换

重写DefWndProc事件

#region Window 消息捕获
        const int WM_COPYDATA = 0x004A;
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }


        [DllImport("user32")]
        public static extern bool ChangeWindowMessageFilter(uint msg, int flags);  

        protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                case WM_COPYDATA:
                    COPYDATASTRUCT mystr = new COPYDATASTRUCT();
                    Type mytype = mystr.GetType();
                    mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
                    Trace(mystr.lpData);
                    processCommand(mystr.lpData);
                    break;
                default:
                    base.DefWndProc(ref m);
                    break;
            }
            //System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString() + "  " + m.Msg.ToString());
        }


        #endregion Window 消息捕获

重写WndProc事件

        //注册热键的api
        [DllImport("user32")]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);

        //解除注册热键的api
        [DllImport("user32")]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

        private frmHotkeyTest testFrm = null;

        private void ShowTestFrm(string _text)
        {
            testFrm = new frmHotkeyTest();
            this.WindowState = FormWindowState.Maximized;
            this.TopMost = true;
            this.Show();
            this.TopMost = false;
            testFrm.Text = _text;
            testFrm.ShowDialog();
        }

        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case 0x0312:  //这个是window消息定义的注册的热键消息  
                    if (m.WParam.ToString() == "123")   // 按下CTRL+Q隐藏  
                    {
                        testFrm = new frmHotkeyTest();
                        testFrm.ShowDialog();
                    }
                    else if (m.WParam.ToString() == "456") // 按下CTRL+W显示
                    {
                        testFrm.Close();
                    }
                    else if (m.WParam.ToString() == "103")
                    {
                        ShowTestFrm("F5");
                    }
                    else if (m.WParam.ToString() == "102")
                    {
                        ShowTestFrm("Ctrl+Alt+D");
                    }
                    else if (m.WParam.ToString() == "101")
                    {
                        ShowTestFrm("Ctrl+B");
                    }
                    else if (m.WParam.ToString() == "100")
                    {
                        ShowTestFrm("Shift+S");
                    }
                    break;
            }
            base.WndProc(ref m);
        }

在回调WndProc方法中,根据消息编码判断各种快捷键回调处理即可

例如:

if (m.WParam.ToString() == "123")   // 按下CTRL+Q隐藏  

 

posted @ 2017-06-15 12:42  0539  阅读(406)  评论(0编辑  收藏  举报