首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

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





热点排行