C# 全局钩子类 无法正常使用
时间:2011-12-12
来源:互联网
public class KeyboardHook
{
public event KeyEventHandler KeyDown;
public event KeyEventHandler KeyUp;
public event KeyPressEventHandler KeyPress;
public delegate IntPtr HookProc(int ncode, IntPtr wparam, IntPtr lparam);
private IntPtr nextHookPtr = IntPtr.Zero; //记录Hook编号
private HookProc hookProc;
public enum HookType //枚举,钩子的类型 WindowsMessageHook
{
MsgFilter = -1,
JournalRecord = 0,
JournalPlayback = 1,
Keyboard = 2,
GetMessage = 3,
CallWndProc = 4,
CBT = 5,
SysMsgFilter = 6,
Mouse = 7,
Hardware = 8,
Debug = 9,
Shell = 10,
ForegroundIdle = 11,
CallWndProcRet = 12,
KeyboardLL = 13,
MouseLL = 14
}
[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode; //定一个虚拟键码。该代码必须有一个价值的范围1至254 。
public int scanCode; // 指定的硬件扫描码的关键。
public int flags; // 键标志
public int time; // 指定的时间戳记的这个讯息。
public int dwExtraInfo; // 指定额外信息相关的信息。
}
[DllImport("User32.dll")]//安装钩子
public static extern IntPtr SetWindowsHookEx(int idHook, [MarshalAs(UnmanagedType.FunctionPtr)] HookProc lpfn, IntPtr hinstance, int threadID);
[DllImport("User32.dll")]//回掉和处理
public static extern IntPtr CallNextHookEx(IntPtr handle, int code, IntPtr wparam, IntPtr lparam);
[DllImport("User32.dll")]//卸载钩子
public static extern void UnhookWindowsHookEx(IntPtr handle);
[DllImport("kernel32.dll")]//卸载钩子
public static extern IntPtr GetModuleHandle(string name);
private IntPtr myKeyBoardHook(int ncode, IntPtr wparam, IntPtr lparam)
{
if (ncode >= 0)
{
KeyboardHookStruct keyInfo = (KeyboardHookStruct)System.Runtime.InteropServices.Marshal.PtrToStructure(lparam, typeof(KeyboardHookStruct));
//KeyboardHookStruct myKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lparam, typeof(KeyboardHookStruct));
WriteTxt(keyInfo.vkCode.ToString());
}
return CallNextHookEx(nextHookPtr, ncode, wparam, lparam); //返回,让后面的程序处理该消息
}
public void SetKeyboardHook()
{
if (nextHookPtr == IntPtr.Zero)
{
//Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0])
hookProc = new HookProc(this.myKeyBoardHook); //键盘事件消息处理函数
nextHookPtr = SetWindowsHookEx((int)HookType.KeyboardLL, hookProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
;
if (nextHookPtr == IntPtr.Zero)
{
throw new Exception("设置Hook失败!");
}
}
}
public void UnKeyboardHook()
{
if (nextHookPtr != IntPtr.Zero)
{
UnhookWindowsHookEx(nextHookPtr); //从Hook链中取消
nextHookPtr = IntPtr.Zero;
}
}
private void WriteTxt(string txtStr)
{
string Apppath=System.IO.Directory.GetCurrentDirectory();
StreamWriter Sw = new StreamWriter(Apppath + "KeyBoard.txt");
Sw.Write(txtStr);
Sw.Close();
}
}
我的一个键盘钩子类,全局的,调用的时候发现不起作用,断点发现我的委托不执行,就是断点在myKeyBoardHook方法不触发断点...帮看下如何解决。谢谢了
{
public event KeyEventHandler KeyDown;
public event KeyEventHandler KeyUp;
public event KeyPressEventHandler KeyPress;
public delegate IntPtr HookProc(int ncode, IntPtr wparam, IntPtr lparam);
private IntPtr nextHookPtr = IntPtr.Zero; //记录Hook编号
private HookProc hookProc;
public enum HookType //枚举,钩子的类型 WindowsMessageHook
{
MsgFilter = -1,
JournalRecord = 0,
JournalPlayback = 1,
Keyboard = 2,
GetMessage = 3,
CallWndProc = 4,
CBT = 5,
SysMsgFilter = 6,
Mouse = 7,
Hardware = 8,
Debug = 9,
Shell = 10,
ForegroundIdle = 11,
CallWndProcRet = 12,
KeyboardLL = 13,
MouseLL = 14
}
[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode; //定一个虚拟键码。该代码必须有一个价值的范围1至254 。
public int scanCode; // 指定的硬件扫描码的关键。
public int flags; // 键标志
public int time; // 指定的时间戳记的这个讯息。
public int dwExtraInfo; // 指定额外信息相关的信息。
}
[DllImport("User32.dll")]//安装钩子
public static extern IntPtr SetWindowsHookEx(int idHook, [MarshalAs(UnmanagedType.FunctionPtr)] HookProc lpfn, IntPtr hinstance, int threadID);
[DllImport("User32.dll")]//回掉和处理
public static extern IntPtr CallNextHookEx(IntPtr handle, int code, IntPtr wparam, IntPtr lparam);
[DllImport("User32.dll")]//卸载钩子
public static extern void UnhookWindowsHookEx(IntPtr handle);
[DllImport("kernel32.dll")]//卸载钩子
public static extern IntPtr GetModuleHandle(string name);
private IntPtr myKeyBoardHook(int ncode, IntPtr wparam, IntPtr lparam)
{
if (ncode >= 0)
{
KeyboardHookStruct keyInfo = (KeyboardHookStruct)System.Runtime.InteropServices.Marshal.PtrToStructure(lparam, typeof(KeyboardHookStruct));
//KeyboardHookStruct myKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lparam, typeof(KeyboardHookStruct));
WriteTxt(keyInfo.vkCode.ToString());
}
return CallNextHookEx(nextHookPtr, ncode, wparam, lparam); //返回,让后面的程序处理该消息
}
public void SetKeyboardHook()
{
if (nextHookPtr == IntPtr.Zero)
{
//Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0])
hookProc = new HookProc(this.myKeyBoardHook); //键盘事件消息处理函数
nextHookPtr = SetWindowsHookEx((int)HookType.KeyboardLL, hookProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
;
if (nextHookPtr == IntPtr.Zero)
{
throw new Exception("设置Hook失败!");
}
}
}
public void UnKeyboardHook()
{
if (nextHookPtr != IntPtr.Zero)
{
UnhookWindowsHookEx(nextHookPtr); //从Hook链中取消
nextHookPtr = IntPtr.Zero;
}
}
private void WriteTxt(string txtStr)
{
string Apppath=System.IO.Directory.GetCurrentDirectory();
StreamWriter Sw = new StreamWriter(Apppath + "KeyBoard.txt");
Sw.Write(txtStr);
Sw.Close();
}
}
我的一个键盘钩子类,全局的,调用的时候发现不起作用,断点发现我的委托不执行,就是断点在myKeyBoardHook方法不触发断点...帮看下如何解决。谢谢了
作者: CrazyCode1981 发布时间: 2011-12-12
自己顶下
作者: CrazyCode1981 发布时间: 2011-12-12
从哪里抄来的代码。这代码本来就不行。你还是再去换一个抄抄吧。
作者: caozhy 发布时间: 2011-12-12
全局钩子 好像必须放在一个单独的DLL文件当中吧
作者: hyttplay 发布时间: 2011-12-13
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28