窗体设置主键 (窗体如何设置主键)

添加窗体以后,我们可以通过一系列事件给窗体添加快捷键

窗体微调怎么只设置向下键,窗体如何设置主键

private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.B)
            {
                MessageBox.Show("B");
            }
        }

这样当我们在按下“B"键时,就可以弹出对话框,但这种方法有一个弱点:窗体必须在获取焦点的情况下,按了才起作用。

我们可以通过使用全局快捷键的方法来解决这个问题,也就是在任何时候按下,程序都会响应快捷键。

整体代码及使用方法如下:

using System.Runtime.InteropServices;

namespace hotkey
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.B)
            {
                MessageBox.Show("B");
            }
        }

        HotKey hk = new HotKey();
        private void Form1_Load(object sender, EventArgs e)
        {
            hk.Reg(Handle, 100, 1 | 2, Keys.G);
        }
        private void Form1_Leave(object sender, EventArgs e)
        {
            hk.UnReg(Handle, 100);
        }
        protected override void WndProc(ref Message m)
        {
            int HotKeyNum = hk.Handle(ref m);
            switch (HotKeyNum)
            {
                case 100:
                    MessageBox.Show("按下了系统热键!");
                    break;
            }
            base.WndProc(ref m);
        }

        /// <summary>
        /// 注册系统快捷键
        /// <para>--------------说明------------------</para>
        /// <para>1、在窗体的Activated事件中写入如下代码:</para>
        /// <para>Reg(Handle, 100, 1 | 2, Keys.G);</para>
        /// <para>Alt = 1,Ctrl = 2,Shift = 4,WindowsKey = 8</para>
        /// <para>2、重写WndProc方法</para>
        /// <para>protected override void WndProc(ref Message m)</para>
        /// <para>{</para>
        /// <para>   int HotKeyNum = Handle(ref m);</para>
        /// <para>   switch (HotKeyNum)</para>
        /// <para>   {</para>
        /// <para>       case 100:</para>
        /// <para>           MessageBox.Show("HAHA");</para>
        /// <para>           break;</para>
        /// <para>   }</para>
        /// <para>   base.WndProc(ref m);</para>
        /// <para>}</para>
        /// <para>3、在窗体的Leave事件中写入如下代码</para>
        /// <para>UnReg(Handle, 100);</para>
        /// <para>------------------------------------</para>
        /// </summary>
        public class HotKey
        {
            [DllImport("user32.dll", SetLastError = true)]
            static extern bool RegisterHotKey(
                IntPtr hWnd,                 //要定义热键的窗口的句柄
                int id,                      //定义热键ID(不能与其它ID重复)          
                int fsModifiers,    //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
                Keys vk                      //定义热键的内容
                );

            [DllImport("user32.dll", SetLastError = true)]
            static extern bool UnregisterHotKey(
                IntPtr hWnd,                 //要取消热键的窗口的句柄
                int id                       //要取消热键的ID
                );

            /// <summary>
            /// 注册系统快捷键
            /// <para>--------------说明------------------</para>
            /// <para>在 Form1_Activated 或 Load 事件中 </para>
            /// <para>Reg(Handle, 100, 1 | 2, Keys.G);</para>
            /// <para>Alt = 1,Ctrl = 2,Shift = 4,WindowsKey = 8</para>
            /// <para>------------------------------------</para>
            /// </summary>
            /// <param name="hWnd">写handle即可</param>
            /// <param name="id">该快捷键的注册数字,如100</param>
            /// <param name="fsModifiers">辅助键如Ctrl,KeyModifiers中的一个</param>
            /// <param name="vk">与fsModifiers的组合键,如Keys.A</param>
            /// <returns></returns>
            public bool Reg(IntPtr hWnd, int id, int fzKeys, Keys vk)
            {
                return RegisterHotKey(hWnd, id, fzKeys, vk);
            }
            /// <summary>
            /// 注销系统快捷键
            /// <para>--------------说明------------------</para>
            /// <para>在 Form1_Leave 或 FormClosed 事件中 </para>
            /// <para>UnReg(Handle, 100);</para>
            /// <para>------------------------------------</para>
            /// </summary>
            /// <param name="hWnd">写字handle即可</param>
            /// <param name="id">该快捷键的数字,如100</param>
            /// <returns></returns>
            public bool UnReg(IntPtr hWnd, int id)
            {
                return UnregisterHotKey(hWnd, id);
            }

            /// <summary>
            /// 得到快捷键的ID
            /// </summary>
            /// <param name="m"></param>
            /// <returns></returns>
            public int Handle(ref Message m)
            {
                const int WM_HOTKEY = 0x0312;
                //按快捷键
                switch (m.Msg)
                {
                    case WM_HOTKEY:
                        return m.WParam.ToInt32();
                }

                return 0;
            }
        }
    }
}

说明

在Form1_Load时,注册快捷键

//Handle照抄就行

//100是快捷键号,只要整个程序对得上就行。

//1|2这里我写的是按下ctrl和alt,这个在我程序中都有说明

//Alt = 1,Ctrl = 2,Shift = 4,WindowsKey = 8

//同时还得加上G键

hk.Reg(Handle, 100, 1 | 2, Keys.G);

在Form1_Leave时,注销

hk.UnReg(Handle, 100);

protected override void WndProc中根据热键号做不同任务

运行调试会发现,按“B”键时弹出对话框只能在获取焦点时,或者说你得看得到窗体,还要点下它这时才行,而按ctrl+alt+G时,在任何情况下,都可以弹出对话框。我在本例中只是用对话框做了个例子,大家可以尝试做其它任务。

窗体微调怎么只设置向下键,窗体如何设置主键