刚学的钩子,赶紧把东西记下来免得以后遗忘。
1.钩子的装卸
环境
Visual Studio 2010 + C# + Win7
/*---这里开始---*/
//首先需要定义几个全局变量
private IntPtr hhook;//全局钩子的句柄.尚未赋值。
private const int WH_MOUSE_LL = 14;//参数(这些具体的参数可在msdn中查找,亦可以在winuser.h中找到)
//... ...一些将会用到的参数
//导入几个将会用到的函数
[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(int idHook, MouseHookProc callback, IntPtr hInstance, uint threadId);//挂钩子用的
[DllImport("user32.dll")]
static extern bool UnhookWindowsHookEx(IntPtr hInstance);//卸载钩子
[DllImport("user32.dll")]
static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);//钩到目标之后(进行处理之后)将目标放走,让它继续它的生活
//定义一个委托(处理钩子用的,回调函数的原型)
private delegate int MouseHookProc(int nCode, int wParam, IntPtr lParam);
//开始
public hook()//构造函数
{
//安装钩子,记得要在不用的时候将钩子卸载掉
this.hhook = SetWindowsHookEx(WH_MOUSE_LL, HookProc, IntPtr.Zero, 0);//给钩子句柄赋值。(private const int WH_MOUSE_LL = 14;)
/*四个参数的说明
/// <param name="idHook">The id of the event you want to hook</param>
/// <param name="callback">The callback.</param>
/// <param name="hInstance">The handle you want to attach the event to, can be null</param>
/// <param name="threadId">The thread you want to attach the event to, can be null</param>
*/
//第一个参数:定义钩的对象:我设定的对象是——鼠标底层消息
//第二个参数:钩中目标之后的回调函数,简而言之就是对沟到的消息进行具体处理的用户编写的函数
//第三个参数:??这个我有些疑问,我个人认为是目标窗体的句柄。但是实际好像要比这个更抽象一些
}
~hook()
{//卸载钩子
UnhookWindowsHookEx(hhook);
}
private int HookProc(int nCode, int wParam, IntPtr lParam)//钩子的回调函数(实际处理钩子的函数)
{
if (nCode >= 0))//
{
switch (wParam)
{
case WM_RBUTTONDOWN://右键按下 ( public const int WM_RBUTTONDOWN = 0x204;)
MessageBox.Show("R_B_Down");
break;
case WM_RBUTTONUP://右键释放 (public const int WM_RBUTTONUP = 0x205;)
... ...
break;
... ...
//call next hook
return CallNextHookEx(hhook, nCode, wParam, lParam);//将钩子放回大自然,继续过他正常的生活
}//switch
}
2.总的来说
挂个普通的全局钩子总共只要走四步
(1)声明(导入)一些将会用到的函数,注意导入SetWindowsHookEx(...)时需要一个定义一个委托(回调函数的原型)本例中的MouseHookProc
(2)声明一个全局句柄,用来保存将来的钩子——private IntPtr hhook;
(3)定义一个处理钩到目标的函数——本例中的HookProc(...)
(4)在需要钩子时,安装钩子——this.hhook = SetWindowsHookEx(WH_MOUSE_LL, HookProc, IntPtr.Zero, 0);
仅此而已,但是这里只是说明了如何挂上一个最简单的全局鼠标钩子,关于钩子更全面的了解,可以参看FellHo先生的文章 http://blog.csdn.net/MaybeHelios/archive/2007/06/21/1660709.aspx
3.其他杂七杂八的笔记
//--
Handle - IntPtr
lpcStr - string来代替
lpStr - StringBuilder
DWord... - Int32
//--
(1)ShowWindow(GetForegroundWindow(), SW_MINIMIZE);//最小化当前窗口
(2)PostMessage(handle, WM_CLOSE , IntPtr.Zero, IntPtr.Zero);//发送关闭应用程序消息 WM_CLOSE=16
(3)GetForegroundWindow();//获得活动窗口的句柄
(4) GetWindowText(...)//获取窗口标题(Caption)
[DllImport( "User32.dll ")]
static extern int GetWindowText(IntPtr handle,StringBuilder text,int MaxLen);
调用
StringBuilder text = new StringBuilder(c);
GetWindowText(handle,text,text.Capacity);