当前位置:编程学习 > C#/ASP.NET >>

C#下如何实现多重热键?

--------------------编程问答-------------------- sendkeys
SendKeys.Send("+a");
SHIFT +  
CTRL ^  
ALT %  

 [DllImport("USER32 ", SetLastError = true)]
    static extern short GetKeyState(int nVirtKey);
    [DllImport("user32")]
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);//注册热键
    [DllImport("user32")]
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id);//解除热键   
    public const int WM_HOTKEY = 0x312;
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        RegisterHotKey(this.Handle, 1, 4 | 2, Keys.A);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_HOTKEY)
        {
            MessageBox.Show("ctrl+shift+a");
        }
        base.WndProc(ref m);
    }
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 1 楼 wuyq11 的回复:
sendkeys
SendKeys.Send("+a");
SHIFT +  
CTRL ^  
ALT %  

 [DllImport("USER32 ", SetLastError = true)]
    static extern short GetKeyState(int nVirtKey);
    [DllImport("user32")]
    public……

谢谢回复,你这种还是实现不了我说的效果呀,我说的是一个键盘辅助键加上两个普通键,或者三个都是普通键这种,而且是一次按下,在VS环境里的很多快捷键都是一个辅助键加上两个普通键。
--------------------编程问答--------------------
引用 2 楼 billlyh 的回复:
ding!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

谢谢帮顶。。。 --------------------编程问答-------------------- 除了 监听还有什么好办法呢? --------------------编程问答-------------------- 没好办法了 --------------------编程问答-------------------- 谢谢楼上两位。难道user32.dll提供的热键注册api只能是辅助键加普通键的组合方式? --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------  晕,楼上的,你在刷分????
--------------------编程问答-------------------- 推荐使用Gma.UserActivityMonitor来处理键盘消息。封装的不错。

HookManager.KeyUp -= HookManager_KeyUp;
        }

        void HookManager_KeyDown(object sender, KeyEventArgs e)
        {
            ProcessMultiKey(e.KeyCode, true);
        }
        
        void HookManager_KeyUp(object sender, KeyEventArgs e)
        {
            ProcessMultiKey(e.KeyCode, false);
        }

        private void ProcessMultiKey(Keys MultiKey, bool DownOrUp)
        {
            if (MultiKey == Keys.C)
                isCDown = DownOrUp;
            else if (MultiKey == Keys.W)
                isWDown = DownOrUp;
            else if (MultiKey == Keys.LControlKey || MultiKey == Keys.RControlKey)
                isCtrlDown = DownOrUp;

            if (isCDown && isCtrlDown)
                CopyToClipBoard();
            else if (isWDown && isCtrlDown)
                SwitchDisplayMode();
        }

部分代码示例 --------------------编程问答--------------------
引用 12 楼 sugarforever 的回复:
推荐使用Gma.UserActivityMonitor来处理键盘消息。封装的不错。

HookManager.KeyUp -= HookManager_KeyUp;
        }

        void HookManager_KeyDown(object sender, KeyEventArgs e)
        {
            ProcessMulti……


谢谢推荐
我去google一下,找到一篇tw的mvp的blog
参考如下:http://www.dotblogs.com.tw/nobel12/archive/2010/03/26/14230.aspx --------------------编程问答-------------------- 另外还有codeproject上的这一篇
http://www.codeproject.com/KB/cs/globalhook.aspx?msg=3110732
Processing Global Mouse and Keyboard Hooks in C# --------------------编程问答-------------------- Utilities这个类库,你google下这个类库。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,