C#如何判断键盘同时按下ctrl和alt两个键

解决方案 »

  1.   

    我现在做了一个输入助理的小程序,同事按下ctrl和alt就启动助理,在按下就取消助理。在一个程序上用
      

  2.   


    //屏蔽键盘
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.IO;
    using System.Reflection;namespace KeyboardDLL
    {
        public class KeyboardHook
        {
            public delegate int KeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);        static int hKeyboardHook = 0;
            KeyboardProc KeyboardHookProcedure;        /// <summary>
            /// 钩子函数,需要引用空间(using System.Reflection;)
            /// 线程钩子监听键盘消息设为2,全局钩子监听键盘消息设为13
            /// 线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14
            /// </summary>        public const int WH_KEYBOARD = 13;
            public const int WH_MOUSE_LL = 14;
            
            public struct KeyboardMSG
            {
                public int vkCode;
                public int scanCode;
                public int flags;
                public int time;
                public int dwExtraInfo;
                public int VK_CONTROL;
                public int VK_MENU;
                public int VK_DELETE;
            }        /// <summary>
            /// kernel32.dll是Windows 95,Windows 98和Windows Me中使用的32位动态链接库文件。
            /// kernel32.dll是负责内存管理、输入输出以及中断等工作。启动Windows系统之后,
            /// kernel32.dll就会被装载到不会被其他应用程序影响的受保护的内存空间中。在某些时候,
            /// 会出现invalid page fault(IPF)错误信息,这是由于其他应用程序视图访问kernel32.dll
            /// 所在的受保护内存空间引起的。不过有时,特定的某些程序也能引起这种错误。
            /// </summary>
            /// <returns></returns>
            [DllImport("kernel32")]
            public static extern int GetCurrentThreadId();        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern int SetWindowsHookEx(int idHook, KeyboardProc lpfn, IntPtr hInstance, int threadId);        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern bool UnhookWindowsHookEx(int idHook);        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);        private int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
            {
                KeyboardMSG m = (KeyboardMSG)Marshal.PtrToStructure(lParam, typeof(KeyboardMSG));
                
                if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)
                {
                    // 不知道这样行不行, 需要测试一下...
                }            return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
            }        // 安装钩子
            public void KeyMaskStart()
            {
                if (hKeyboardHook == 0)
                {
                    // 创建HookProc实例
                    KeyboardHookProcedure = new KeyboardProc(KeyboardHookProc);                // 设置线程钩子
                    hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProcedure,
                        Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
                    // 如果设置钩子失败
                    if (hKeyboardHook == 0)
                    {
                        KeyMaskStop();
                        throw new Exception("SetWindowsHookEx failed.");
                    }
                }
            }        // 卸载钩子
            public void KeyMaskStop()
            {
                bool retKeyboard = true;
                if (hKeyboardHook != 0)
                {
                    retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
                    hKeyboardHook = 0;
                }
                if (!(retKeyboard))
                {
                    throw new Exception("UnhookWindowsHookEx  failed.");
                }
            }
        }
    }(int)Control.ModifierKeys == (int)Keys.Control + (int)Kyes.Alt
      

  3.   

    额 最好别用这2个键。。 换别的键。C# winform的窗体类有KeyPreview属性,可以接收窗体内控件的键盘时间注册。
    窗体和控件都有KeyDown,KeyUp,KeyPress三个事件,每个时间都会有KeyEventArgs参数传入,只要判断传入参数的KeyChar就可以了,Framework提供了Keys枚举来表示键盘上的各个键。核心判断的代码如下:
    1.单键判断
    if (e.KeyCode == Keys.Delete)
    {
         //处理逻辑

    2.组合建判断:  
    if (e.Modifiers.CompareTo(Keys.Control) == 0 && e.KeyCode == Keys.Delete)
    {
         //处理逻辑
    }
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/HowkWolf/archive/2008/12/01/3419626.aspx
    ======
    or
    C#判断是否按下了组合键
      private void txt_name_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
      {
       if(this.btn_ok.Text=="修改(&S)")
       {
        if(e.Modifiers==Keys.Alt&&e.KeyCode==Keys.X)//不能是e.KeyData
        {
         txt_name.ReadOnly=false;
        }
       }
      } 
    ---------------------------------------------------------------------------------------  
    private void dataGrid3_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
      {
       //在dataGrid3里按下(Alt+a)组合键,直接通过该单的所有明细
       if(e.Alt&&e.KeyCode==Keys.A)   {}
     }
      

  4.   


    if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)
    {
           Console.WriteLine("按下了Ctrl+ Alt");
           Return 1;}
      

  5.   

    你这个要用到Windows热键注册,才可以的。
    C#里有没有简化的方法不知道。
    但是以前,我都是调用WindowsAPI完成这些工作的。
    效果就是:软件启动后,在后台运行,在桌面上点击注册的热键(如:Ctrl+Alt),就调出软件的界面。
    函数是:
    软件运行的时候:RegisterHotKey
    软件推出的时候:UnRegisterHotKey
    还要捕捉一些系统消息。