在Winfrom中双击Ctrl键打开窗体

这篇博客详细介绍了如何在窗体应用中通过双击Ctrl键来控制窗体的显示与隐藏。作者通过注册热键、时间判断以及消息过滤等技术实现了这一功能,使得用户可以通过快捷键交互来高效操作窗体。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双击ctrl打开窗体

//在load事件中定义快捷键

private void Form2_Load(object sender, EventArgs e)
    {
        Hotkey hotkey;
        hotkey = new Hotkey(this.Handle);
        Hotkey.Hotkey1 = hotkey.RegisterHotkey(System.Windows.Forms.Keys.ControlKey, Hotkey.KeyFlags.MOD_CONTROL);   //定义快键(ctrl+ctrl)
        hotkey.OnHotkey += new HotkeyEventHandler(OnHotkey);
    }

//通过时间判断是不是双击

  public void OnHotkey(int HotkeyID) //ctrl+ctrl隐藏窗体,再按显示窗体。
    {
        if (times == 0)
        {
            first = DateTime.Now;
        }
        times++;
        lock (this)
        {
            if (times >= 2)
            {
                last = DateTime.Now;
                TimeSpan ts = last.Subtract(first).Duration();
                if (ts.Seconds < 2&&HotkeyID == Hotkey.Hotkey1)
                {
                    if (this.Visible == true)
                    { this.Visible = false; times = 0; }

                    else
                    { this.Visible = true; times = 0; }
                    times = 0;
                }
                else
                {
                    times = 0;
                }
            }
        }
    }

//通过 [DllImport(“kernel32.dll”)]定义方法

 public class Hotkey : System.Windows.Forms.IMessageFilter
    {
        Hashtable keyIDs = new Hashtable();
        IntPtr hWnd;
        static public int Hotkey1;
        public event HotkeyEventHandler OnHotkey;
        public enum KeyFlags
        {
            MOD_ALT = 0x1,
            MOD_CONTROL = 0x2,
            MOD_SHIFT = 0x4,
            MOD_WIN = 0x8
        }
        [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 Hotkey(IntPtr hWnd)
        {
            this.hWnd = hWnd;
            Application.AddMessageFilter(this);
        }
        public int RegisterHotkey(Keys Key, KeyFlags keyflags)
        {
            UInt32 hotkeyid = GlobalAddAtom(System.Guid.NewGuid().ToString());
            RegisterHotKey((IntPtr)hWnd, hotkeyid, (UInt32)keyflags, (UInt32)Key);
            keyIDs.Add(hotkeyid, hotkeyid);
            return (int)hotkeyid;
        }
        public void UnregisterHotkeys()
        {
            Application.RemoveMessageFilter(this);
            foreach (UInt32 key in keyIDs.Values)
            {
                UnregisterHotKey(hWnd, key);
                GlobalDeleteAtom(key);
            }
        }
        public bool PreFilterMessage(ref System.Windows.Forms.Message m)
        {
            if (m.Msg == 0x312)
            {
                if (OnHotkey != null)
                {
                    foreach (UInt32 key in keyIDs.Values)
                    {
                        if ((UInt32)m.WParam == key)
                        {
                            OnHotkey((int)m.WParam);
                            return true;
                        }
                    }
                }
            }
            return false;
        }
    }

//判断是不是有别的快捷键用到了ctrl。用到了话时间归零

private void Form2_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode != Keys.Control )
        {
            times = 0;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值