
记一次鼠标钩子的使用
惰性啊,好久没写东西了,但是最近这东西太重要,所以决心记出来,后续可以说说。
第一个提示 enter local portbase: ,意思更清楚,一个主机端口,我键入了8989,然后换行,第二个提示 enter the destination ip address 输入目标ip地址,我输入了127.0.0.1本机嘛. 第三个提示 enter the destionation port 目标端口,直接键入8888.然后回车再来个提示number of packets you wish to be sent: 你想发送多少个包,我想发送10个就输入10吧,回车. 此时错误来了:error: the specified port base is not an even number,主机端口错了...怎么回事.关了再来 输入9999 127.0.0.1 8888 10 问题还是一样.这就尴尬了,源码的难题吗,看了一个源码貌似例子:有一个form,form里有个textbox,我们想使用户在textbox里输入的之后,不管敲键盘的那个键,textbox里显示的一直为“a”,这时我们就可以借助钩子鼠标消息,先往windows的钩子链表中加入一个自己写的钩子鼠标消息,只要一按上键盘都会造成一个键盘消息,我们的钩子在这个消息放到textbox之前先截获它,让textbox显示一个“a”,之后结束这个消息,这样textbox得到的总是“a”,这时我们就可以借助钩子鼠标消息,先往windows的钩子链表中加入一个自己写的钩子鼠标消息,只要一按上键盘都会造成一个键盘消息,我们的钩子在这个消息放到textbox之前先截获它鼠标 钩子,让textbox显示一个“
顾名思义,围绕着鼠标的操作而进行的,提前附上鼠标的相关Intptr值:
private const int WM_MOUSEMOVE = 0x200;
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_RBUTTONDOWN = 0x204;
private const int WM_MBUTTONDOWN = 0x207;

private const int WM_LBUTTONUP = 0x202;
private const int WM_RBUTTONUP = 0x205;
private const int WM_MBUTTONUP = 0x208;
private const int WM_LBUTTONDBLCLK = 0x203;
private const int WM_RBUTTONDBLCLK = 0x206;
private const int WM_MBUTTONDBLCLK = 0x209; 十六进制的值,注意和十进制之间的转换
钩子源码网上好多就不敲了,使用过程简单说一下:
创建对象

安装钩子
绑定事件
卸载钩子(释放资源)
钩子里有这么一段代码鼠标 钩子,说下用的之后存在的坑:
private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct));
if (nCode < 0)

{
return win32api.callnexthookex(hhook, ncode, wparam, lparam)return callnexthookex(hhook, ncode, wparam, lparam)return::callnexthookex(hhook,ncode,wparam,lparam)
}
else
{
//判断能否是鼠标点击 规避鼠标移动函数
if (wParam.ToString("X2") == "201" || wParam.ToString("X2") == "204")
{

MouseButtons button = MouseButtons.Left;
var e = new MouseEventArgs(button, 1, point.X, point.Y, 0);
MouseClickEvent?.Invoke(this, e);
this.point = new point(mymousehookstruct.pt.x, mymousehookstruct.pt.y) mouseeventargs e = new mouseeventargs(button, clickcount, mymousehookstruct.pt.x, mymousehookstruct.pt.y, delta) e = new mouseeventargs(button, doubleclickcount, mymousehookstruct.pt.x, mymousehookstruct.pt.y, delta)
//return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);
}
return default(int);
}
}
还有用键盘钩子截获鼠标右键消息来超过目的,这里应该切记一点,当鼠标单击释放时菜单就会跳出(由于起初只截获了鼠标按上的消息,程序仍然不灵,一度怀疑用钩子实现的可能性,哎,细心细心啊)低级鼠标钩子跟低级屏幕钩子一样,只不过它截获的是鼠标事件,也有个普通鼠标钩子(wh_mouse),和低级鼠标钩子的差别参考低级键盘钩子跟普通键盘钩子的差别api_释放平台钩子 (鼠标钩子)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-132943-1.html
我们的烊烊小王子
美国威胁恐吓伊拉克没用的