想要一个键盘钩子的实例 刚自学了点c#,对于键盘事件掌握不深,对于hook感兴趣,不知哪位高人给个hook实例,谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://topic.csdn.net/u/20090106/12/8c4c1a5d-4e99-4f3f-b0cd-e1c0129e2a29.html [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid); [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern bool UnhookWindowsHookEx(IntPtr hhook); public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); public enum WindowsHookCodes { WH_MSGFILTER = (-1), WH_JOURNALRECORD = 0, WH_JOURNALPLAYBACK = 1, WH_KEYBOARD = 2, WH_GETMESSAGE = 3, WH_CALLWNDPROC = 4, WH_CBT = 5, WH_SYSMSGFILTER = 6, WH_MOUSE = 7, WH_HARDWARE = 8, WH_DEBUG = 9, WH_SHELL = 10, WH_FOREGROUNDIDLE = 11, WH_CALLWNDPROCRET = 12, WH_KEYBOARD_LL = 13, WH_MOUSE_LL = 14 } [DllImport("kernel32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] public static extern int GetCurrentThreadId(); public class HookMessage { private IntPtr m_HookEx; /// <summary> /// 设置自己进程的钩子 /// </summary> /// <param name="p_HookCodes">钩子类型</param> public HookMessage(WindowsHookCodes p_HookCodes) { m_HookEx = SetWindowsHookEx((int)p_HookCodes, new HookProc(SetHookProc), IntPtr.Zero, GetCurrentThreadId()); } /// <summary> /// 设置进程的钩子 /// </summary> /// <param name="p_HookCodes">钩子类型</param> /// <param name="p_ThreadID">全局钩子</param> public HookMessage(WindowsHookCodes p_HookCodes, bool p_Zero) { IntPtr _Value =System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]); m_HookEx = SetWindowsHookEx((int)p_HookCodes, new HookProc(SetHookProc), _Value, 0); } /// <summary> /// 关闭钩子 /// </summary> public void UnHookMessage() { if (UnhookWindowsHookEx(m_HookEx)) { m_HookEx = IntPtr.Zero; } } public delegate void GetHookMessage(int p_Code, IntPtr p_wParam, IntPtr p_lParam,ref bool p_Send); public event GetHookMessage GetHook; private IntPtr SetHookProc(int p_Code, IntPtr p_wParam, IntPtr p_lParam) { GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); bool _SendMessage = true; if (GetHook != null) GetHook(p_Code, p_wParam, p_lParam, ref _SendMessage); if (!_SendMessage) return new IntPtr(1); return IntPtr.Zero; } }把这些放到一个单独的项目里 编译成DLL 调用就可以了..不复杂的. 如何动态创建 请问一个存储过程中output的问题? 如何让Winform程序 返回主页面MainForm 向数据库中插入数据出错,望大家给指点一下,谢了! SQL Mdi窗体工具栏合并问题? c#中 如何处理数据库中的可为空的字段 在WPF中如何实现托盘图标 为什么用C#2003生成的Excel 会比较大 能否改变richtextbox Enable时的背景色和前景色。 如何在程序里播放视频和声音文件 请问VS2008里有性能测试工具吗
public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid); [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool UnhookWindowsHookEx(IntPtr hhook); public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); public enum WindowsHookCodes
{
WH_MSGFILTER = (-1),
WH_JOURNALRECORD = 0,
WH_JOURNALPLAYBACK = 1,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_CBT = 5,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_HARDWARE = 8,
WH_DEBUG = 9,
WH_SHELL = 10,
WH_FOREGROUNDIDLE = 11,
WH_CALLWNDPROCRET = 12,
WH_KEYBOARD_LL = 13,
WH_MOUSE_LL = 14
}
[DllImport("kernel32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern int GetCurrentThreadId(); public class HookMessage
{
private IntPtr m_HookEx;
/// <summary>
/// 设置自己进程的钩子
/// </summary>
/// <param name="p_HookCodes">钩子类型</param>
public HookMessage(WindowsHookCodes p_HookCodes)
{
m_HookEx = SetWindowsHookEx((int)p_HookCodes, new HookProc(SetHookProc), IntPtr.Zero, GetCurrentThreadId());
}
/// <summary>
/// 设置进程的钩子
/// </summary>
/// <param name="p_HookCodes">钩子类型</param>
/// <param name="p_ThreadID">全局钩子</param>
public HookMessage(WindowsHookCodes p_HookCodes, bool p_Zero)
{
IntPtr _Value =System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]);
m_HookEx = SetWindowsHookEx((int)p_HookCodes, new HookProc(SetHookProc), _Value, 0);
}
/// <summary>
/// 关闭钩子
/// </summary>
public void UnHookMessage()
{
if (UnhookWindowsHookEx(m_HookEx))
{
m_HookEx = IntPtr.Zero;
}
} public delegate void GetHookMessage(int p_Code, IntPtr p_wParam, IntPtr p_lParam,ref bool p_Send);
public event GetHookMessage GetHook; private IntPtr SetHookProc(int p_Code, IntPtr p_wParam, IntPtr p_lParam)
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
bool _SendMessage = true;
if (GetHook != null) GetHook(p_Code, p_wParam, p_lParam, ref _SendMessage);
if (!_SendMessage) return new IntPtr(1);
return IntPtr.Zero;
}
}把这些放到一个单独的项目里 编译成DLL 调用就可以了..不复杂的.