日期:2014-05-18  浏览次数:20829 次

Winform应用程序_如何屏蔽键盘输入 顶着有分
我现在做的WINFORM程序需要屏蔽掉键盘操作(点击键盘上的所有按键都没效果),请问该如何实现呢?

------解决方案--------------------
重写窗体 protected override void WndProc(ref Message m)
过滤掉键盘消息
------解决方案--------------------
http://topic.csdn.net/t/20041220/21/3661867.html
------解决方案--------------------
感觉是不是应该重写键盘钩子啊
------解决方案--------------------
http://topic.csdn.net/u/20091216/12/a9e83cfc-0c21-44d7-9ebe-1936746f34d9.html?46213
------解决方案--------------------
首先创建一个类,继承Form。然后重写WndProc方法。
C# code

         protected override void WndProc(ref Message m)
         {
            if (m.Msg != 0x0100)
              base.WndProc(ref m);
         }

------解决方案--------------------
C# code

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Reflection; 
using System.Diagnostics; 
using Microsoft.Win32; 

namespace WindowsApplication1 
{ 
    public partial class Form2 : Form 
    { 
        //委托 
        public delegate int HookProc(int nCode, int wParam, IntPtr lParam); 
        static int hHook = 0; 
        public const int WH_KEYBOARD_LL = 13; 

        //LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。 
        HookProc KeyBoardHookProcedure; 

        //键盘Hook结构函数 
        [StructLayout(LayoutKind.Sequential)] 
        public class KeyBoardHookStruct 
        { 
            public int vkCode; 
            public int scanCode; 
            public int flags; 
            public int time; 
            public int dwExtraInfo; 
        } 
        #region DllImport 
        //设置钩子 
        [DllImport("user32.dll")] 
        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 bool UnhookWindowsHookEx(int idHook); 
        [DllImport("user32.dll")] 
        //调用下一个钩子 
        public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam); 

        [DllImport("kernel32.dll")] 
        public static extern int GetCurrentThreadId(); 

        [DllImport("kernel32.dll")] 
        public static extern IntPtr GetModuleHandle(string name); 

        public void Hook_Start() 
        { 
            // 安装键盘钩子 
            if (hHook == 0) 
            { 
                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc); 

                //hHook = SetWindowsHookEx(2, 
                //            KeyBoardHookProcedure, 
                //          GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId()); 

                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, 
                          KeyBoardHookProcedure, 
                        GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); 

                //如果设置钩子失败. 
                if (hHook == 0) 
                { 
                    Hook_Clear(); 
                    //throw new Exception("设置Hook失败!"); 
                } 
            } 
        } 

        //取消钩子事件 
        public void Hook_Clear() 
        { 
            bool retKeyboard = true; 
            if (hHook != 0) 
            { 
                retKeyboard = UnhookWindowsHookEx(hHook); 
                hHook = 0; 
            } 
            //如果去掉钩子失败. 
            if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed."); 
        } 

        //这里可以添加自己想要的信息处理 
        public static int KeyBoardHookProc(int nCode, int wParam, I