问一下键盘钩子或者用户控件有关问题

问一下键盘钩子或者用户控件问题我想阻止键盘按删除键,但是我是在用户控件里,只有OnPreviewKeyDown事件,其

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

//这里可以添加自己想要的信息处理


public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam) 
{ 
if (nCode >= 0) 
{ 
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct)); 
if (kbh.vkCode == (int)Keys.S && (int)Control.ModifierKeys == (int)Keys.Control) // 截获F8
{ 
MessageBox.Show("快捷键已拦截!不能保存!"); 
return 1; 

} 
if (kbh.vkCode == (int)Keys.Y 
&& (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+Y
{ 

//MessageBox.Show("不能全部保存!");
return 1; 
} 
if (kbh.vkCode == (int)Keys.X) 
{ 
MessageBox.Show("不能全部保存!"); 
return 1; 
} 
} 
return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 
#endregion 

public Form4() 
{ 

InitializeComponent(); 
} 
private void button1_Click(object sender, EventArgs e) 
{ 
Hook_Start(); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
Hook_Clear(); 
} 


} 
}