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

问一下键盘钩子或者用户控件问题
我想阻止键盘按删除键,但是我是在用户控件里,只有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