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

解决方案 »

  1.   

    重写窗体 protected override void WndProc(ref Message m)
    过滤掉键盘消息 
      

  2.   

    http://topic.csdn.net/t/20041220/21/3661867.html
      

  3.   

    http://topic.csdn.net/u/20091216/12/a9e83cfc-0c21-44d7-9ebe-1936746f34d9.html?46213
      

  4.   

    主要的就是把"Win"键给屏蔽掉
      

  5.   

    首先创建一个类,继承Form。然后重写WndProc方法。         protected override void WndProc(ref Message m)
             {
                if (m.Msg != 0x0100)
                  base.WndProc(ref m);
             }
      

  6.   

    这里的m.Msg!=0x0100 是什么意思?
      

  7.   

    来人HELP呀 我到网上找了半天给的都是链接 还都测试不通的
      

  8.   


    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, IntPtr lParam) 
            { 
                if (nCode >= 0) 
                { 
                    KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct)); 
                    if (kbh.vkCode == 91)  // 截获左win(开始菜单键) 
                    { 
                        return 1; 
                    } 
                    if (kbh.vkCode == 92)// 截获右win 
                    { 
                        return 1; 
                    } 
                    if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control) //截获Ctrl+Esc 
                    { 
                        return 1; 
                    } 
                    if (kbh.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt)  //截获alt+f4 
                    { 
                        return 1; 
                    } 
                    if (kbh.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt) //截获alt+tab 
                    { 
                        return 1; 
                    } 
                    if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift) //截获Ctrl+Shift+Esc 
                    { 
                        return 1; 
                    } 
                    if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Alt)  //截获alt+空格 
                    { 
                        return 1; 
                    } 
                    if (kbh.vkCode == 241)                  //截获F1 
                    { 
                        return 1; 
                    } 
                    if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete)      //截获Ctrl+Alt+Delete 
                    { 
                        return 1; 
                    } 
                    //if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift)      //截获Ctrl+Shift 
                    //{ 
                    //    return 1; 
                    //} 
                  
                    //if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)  //截获Ctrl+Alt+空格 
                    //{ 
                    //    return 1; 
                    //} 
                } 
                return CallNextHookEx(hHook, nCode, wParam, lParam); 
            }         #endregion         public Form2() 
            { 
                InitializeComponent(); 
            } 
            
            private void Form2_Load(object sender, EventArgs e) 
            { 
                Hook_Start();             //通过修改注册表来屏蔽任务管理器 
                //try 
                //{ 
                //    RegistryKey r = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", true); 
                //    r.SetValue("DisableTaskMgr", "1");  //屏蔽任务管理器 
                //} 
                //catch 
                //{ 
                //    RegistryKey r = Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"); 
                //    r.SetValue("DisableTaskMgr", "0"); 
                //} 
            }         private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
            { 
                Hook_Clear(); 
            }         private void Form2_MouseMove(object sender, MouseEventArgs e) 
            { 
                System.Windows.Forms.Cursor.Clip = new Rectangle(this.Location, this.Size); //控制鼠标在窗口范围内 
            } 
        } 
    }
      

  9.   

    能请教你的这个FORM都屏蔽了哪些按键? 
      

  10.   

    你是要屏蔽WINFROM中的某一个控件,还是整个WINFROM,如果是某一个控件的话可以用事件,如果是整个WINFROM可能要用到钩子~
      

  11.   


     private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyData != Keys.None)
                {
                    e.SuppressKeyPress = true;
                }        }
      

  12.   

    win alt tab等系统按键,必须通过hook键盘消息才能实现屏蔽。
    具体代码网上找找吧,hook键盘消息应该很多的
      

  13.   

    加上这段代码,保你能屏蔽键盘事件,能的话多给几分,不能的话,就别给了!!!protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {            
                return true;
            }
      

  14.   

    http://www.javaeye.com/topic/601061http://topic.csdn.net/u/20080320/23/576bd398-4804-40be-9886-9afb18ee5cf9.html
      

  15.   

    http://blog.sina.com.cn/s/blog_60ddd93f0100ey4l.html
      

  16.   

    做自己的程序阿 程序运行起来 点“WIN” “CTRL+ALT+DELETE”不能有效果
      

  17.   

    平布键盘输入无非是写个脚本,把OnKeyUp事件、OnKeyDown事件设置成无效状态
      

  18.   

            protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                if (keyData == Keys.Enter)
                {
                    SendKeys.Send("{Tab}");                return true;
                }
                return base.ProcessCmdKey(ref msg, keyData);
            }我这个是当键盘按下回车时执行Tab键的操作。希望能给楼主一些启发。
      

  19.   

    挂钩子,屏蔽键盘消息.
    查下API就知道了.
      

  20.   

    重写窗体 protected override void WndProc(ref Message m)
    过滤掉键盘消息
      

  21.   

    首先添加一个类库using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Reflection;public delegate int HOOKPROC(int code, IntPtr wparam, IntPtr lparam);
    public class Hook  
    {
        [DllImport("user32.dll")]
        public static extern IntPtr SetWindowsHookEx(int Type, HOOKPROC lpfn, IntPtr hmod, int dwThreadId);     
        [DllImport("User32.dll")] 
        public extern static int CallNextHookEx(IntPtr handle, int code, IntPtr wparam, IntPtr lparam);    public IntPtr SetHook(HOOKPROC method)
        {
            return SetWindowsHookEx(13, method, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
        }
    }然后应用上面的类库
    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;namespace ConsoleApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        IntPtr hand;
            private void Form1_Load(object sender, EventArgs e)
            {
                Hook h = new Hook();
                HOOKPROC method = new HOOKPROC(Dispose);
                hand = h.SetHook(method);
            }
            private int Dispose(int code, IntPtr wparam, IntPtr lparam)
            {
                if (code != 0)
                    return Hook.CallNextHookEx(hand, code, wparam, lparam);
                KeyBoardHookStruct kbhs = (KeyBoardHookStruct)Marshal.PtrToStructure(lparam, typeof(KeyBoardHookStruct));
                if (wparam == (IntPtr)256)
                {
                    Console.WriteLine(kbhs.vkCode);
                    if (kbhs.vkCode == 162 || kbhs.vkCode == 91 || kbhs.vkCode == 46)
                        return 1;
                }
                return 0;
            }
        }
        public struct KeyBoardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
    }对于 ctrl+alt+del 还不能屏蔽  只能屏蔽win键
      

  22.   

    饿 你这个代码测试了嘛 我测试了下 “WIN”键盘没有屏蔽掉饿
      

  23.   

    重写 KeyDown,KeyPress,KeyUp事件并清除其代码,即让三个事件失效.
      

  24.   

    这段代码除了"CTRL+ALT+DELETE"没屏蔽掉 其他都OK 收藏了