问一下键盘钩子或者用户控件问题
我想阻止键盘按删除键,但是我是在用户控件里,只有OnPreviewKeyDown事件,其他的删除或者退格都不能被捕获。
问大虾们,怎么来处理??
------解决方案--------------------
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;  
namespace WindowsApplication1  
{  
   ///   <summary> 
   /// Description of MainForm. 
   ///   </summary> 
   public partial class Form4 : 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);         
       #endregion  
       #region 自定义事件  
       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.");&nb