要求禁用后按任何键盘按键都不起作用,最好就是跟键盘没插一样,只有通过解除禁用才能恢复。
最好是源码或示例

解决方案 »

  1.   

    键盘钩子,hook,WH_KEYBOARD... http://tech.sina.com.cn/s/s/2004-12-20/0751479359.shtml
      

  2.   

    参见:Low-level Windows API hooks from C# to stop unwanted keystrokes
    http://www.codeproject.com/KB/system/CSLLKeyboard.aspx?display=Print你可以stop all keystrokes
      

  3.   

    using System.Windows.Forms;class Test : Form
    {
      protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
      {
        return true;
      }  static void Main()
      {
        Application.Run(new Test());
      }
    }
      

  4.   

    using System.Windows.Forms;class Test : Form
    {
      protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
      {
        return true;
      }
      
      Test()
      {
        TextBox tbx = new TextBox();
        tbx.Parent  = this;
        tbx.Text    = "任何按键都无效";
      }
      
      static void Main()
      {
        Application.Run(new Test());
      }
    }
      

  5.   

    http://topic.csdn.net/u/20081025/14/f8aad5aa-b219-4350-beb7-bde249d3c471.html
      

  6.   

     class HookMouseAndKeyboard
        {
            #region 锁定鼠标和键盘
            //有关鼠标和键盘钩子的相关定义
            static int hhookMouse = 0;
            static int hhookKeyBoard = 0;
            public const int WH_MOUSE = 14;
            public const int WH_KEYBOARD = 2;
            public const int WH_MOUSE_LL = 14;
            private const int WH_KEYBOARD_LL = 13;
            public const int HC_ACTION = 0;
            //public const int WM_KEYDOWN = 0x100;
            //public const int VK_RETURN = 0xD;
            public delegate int HookProc(int nCode, IntPtr wParam, IntPtr iParam);
            HookProc MouseHookProcedure, KeyBoardHookProcedure;
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hinstance, int threadid);
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, int lParam);
            [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
            public static extern bool UnhookWindowsHookEx(int idHook);
            /// <summary>
            /// 钩子处理方法(鼠标锁定)
            /// </summary>
            /// <param name="nCode"></param>
            /// <param name="wParam"></param>
            /// <param name="lParam"></param>
            /// <returns></returns>
            private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
            {
                //如果nCode<0,直接调用CallNextHookEx返回
                if (nCode < 0)
                    //return CallNextHookEx(hhookMouse,nCode,wParam,lParam);
                    return 1;
                //函数将消息向下传递,下一个钩子处理将截获这一消息
                //if(nCode!= HC_ACTION)
                //    return CallNextHookEx(hhookMouse, nCode, wParam, lParam);
                return 1;
            }
            /// <summary>
            /// 启动鼠标锁定
            /// </summary>
            /// <returns></returns>
            public bool EnableMouseCapture()
            {
                MouseHookProcedure = new HookProc(this.MouseHookProc);
                Process currentProcess = Process.GetCurrentProcess();            //安装全局鼠标钩子
                hhookMouse = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, currentProcess.MainModule.BaseAddress, 0);
                if (hhookMouse == 0)
                    return false;
                return true;
            }
            /// <summary>
            /// 解除鼠标锁定
            /// </summary>
            /// <returns></returns>
            public bool DisableMouseCapture()
            {
                return UnhookWindowsHookEx(hhookMouse);
            }        /// <summary>
            /// 钩子处理方法(键盘锁定)
            /// </summary>
            /// <param name="nCode"></param>
            /// <param name="wParam"></param>
            /// <param name="lParam"></param>
            /// <returns></returns>
            private int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
            {
                //如果nCode<0,直接调用CallNextHookEx返回
                if (nCode < 0)
                    //return CallNextHookEx(hhookKeyBoard, nCode, wParam, lParam);
                    return 1;
                //函数将消息向下传递,下一个钩子处理将截获这一消息
                //if (nCode != HC_ACTION)
                //return CallNextHookEx(hhookKeyBoard, nCode, wParam, lParam);
                return 1;
            }
            /// <summary>
            /// 启动键盘锁定
            /// </summary>
            /// <returns></returns>
            public bool EnableKeyBoardCapture()
            {
                KeyBoardHookProcedure = new HookProc(this.KeyBoardHookProc);
                Process currentProcess = Process.GetCurrentProcess();            //安装全局键盘钩子
                hhookKeyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, currentProcess.MainModule.BaseAddress, 0);
                if (hhookKeyBoard == 0)
                    return false;
                return true;
            }
            /// <summary>
            /// 解除键盘锁定
            /// </summary>
            /// <returns></returns>
            public bool DisableKeyBoardCapture()
            {
                return UnhookWindowsHookEx(hhookKeyBoard);
            }        #endregion
        }
      

  7.   

       private void Form1_Load(object sender, EventArgs e)
            {
                Key.HookMessage _HookMessage = new Key.HookMessage(Key.HookMessage.WindowsHookCodes.WH_KEYBOARD_LL, true);            _HookMessage.GetHook+=new Key.HookMessage.GetHookMessage(_HookMessage_GetHook);
               
            }        bool m_SendKeyCode = false;
            void _HookMessage_GetHook(int p_Code, IntPtr p_wParam, IntPtr p_lParam, ref bool p_Send)
            {
                p_Send = m_SendKeyCode;
            }你可以控制m_SendKeyCode 来决定键盘是否有效
    下面的类 必须放到一个DLL里..引用就好了
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    namespace Key
    {
        /// <summary>
        /// 用钩子获取消息
        /// [email protected]
        /// </summary>
        public class HookMessage
        {
            private IntPtr m_HookEx;
            /// <summary>
            /// 设置自己进程的钩子
            /// </summary>
            /// <param name="p_HookCodes">钩子类型</param>
            public HookMessage(WindowsHookCodes p_HookCodes)
            {
                m_HookEx = SetWindowsHookEx((int)p_HookCodes, new HookProc(SetHookProc), IntPtr.Zero, GetCurrentThreadId());
            }
            /// <summary>
            /// 设置进程的钩子
            /// </summary>
            /// <param name="p_HookCodes">钩子类型</param>
            /// <param name="p_ThreadID">全局钩子</param>
            public HookMessage(WindowsHookCodes p_HookCodes, bool p_Zero)
            {
                IntPtr _Value = System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]);
                m_HookEx = SetWindowsHookEx((int)p_HookCodes, new HookProc(SetHookProc), _Value, 0);
            }
            /// <summary>
            /// 关闭钩子
            /// </summary>
            public void UnHookMessage()
            {
                if (UnhookWindowsHookEx(m_HookEx))
                {
                    m_HookEx = IntPtr.Zero;
                }
            }        public delegate void GetHookMessage(int p_Code, IntPtr p_wParam, IntPtr p_lParam, ref bool p_Send);
            public event GetHookMessage GetHook;        private IntPtr SetHookProc(int p_Code, IntPtr p_wParam, IntPtr p_lParam)
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                bool _SendMessage = true;
                if (GetHook != null) GetHook(p_Code, p_wParam, p_lParam, ref _SendMessage);
                if (!_SendMessage) return new IntPtr(1);
                return IntPtr.Zero;
            }
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid);        public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);        [DllImport("kernel32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
            public static extern int GetCurrentThreadId();        public enum WindowsHookCodes
            {
                WH_MSGFILTER = (-1),
                WH_JOURNALRECORD = 0,
                WH_JOURNALPLAYBACK = 1,
                WH_KEYBOARD = 2,
                WH_GETMESSAGE = 3,
                WH_CALLWNDPROC = 4,
                WH_CBT = 5,
                WH_SYSMSGFILTER = 6,
                WH_MOUSE = 7,
                WH_HARDWARE = 8,
                WH_DEBUG = 9,
                WH_SHELL = 10,
                WH_FOREGROUNDIDLE = 11,
                WH_CALLWNDPROCRET = 12,
                WH_KEYBOARD_LL = 13,
                WH_MOUSE_LL = 14
            }        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
            public static extern bool UnhookWindowsHookEx(IntPtr hhook);  
        }
    }
         
      

  8.   

    好象是在key_press事件中设置一下e.handled=true,不知道是不是的,你是一下
      

  9.   

    问题基本上解决了,我用键盘钩子差不多搞定了,可是不能禁用ctrl+alt+del,有没谁知道的啊