我有以下疑问:到底什么时候要用全局钩子
它到底有什么用,没有它会怎么样。
比如我的理解是如果是一个1.exe和1.dll,由1.exe加载1.exe,那么还要不要全局钩子。而http://www.csdn.net/develop/Read_Article.asp?Id=26112这篇文章中也要全局钩子的,不过它挂在QQ.exe上启动啊.
不懂,到底该用些什么全局变量。
它到底有什么用,没有它会怎么样。
比如我的理解是如果是一个1.exe和1.dll,由1.exe加载1.exe,那么还要不要全局钩子。而http://www.csdn.net/develop/Read_Article.asp?Id=26112这篇文章中也要全局钩子的,不过它挂在QQ.exe上启动啊.
不懂,到底该用些什么全局变量。
解决方案 »
- 用CFileFind枚举文件时文件名太长导致失败如何解决?
- mfc中怎么使用web browser控件打开一个需要参数才能打开的网页?
- 程序调试出现这样的问题,请问估计怎么下手调通啊??谢谢了!
- 怎样区分DLL和COM,
- 300分!!求助对话框拖动问题!
- 如何只显示对话框?
- 我的用户接口线程的Run()没反应了,但::GetExitCodeThread()函数返回的却是STILL_ACTIVE???求救!!!
- 如何调试 ISAPI 程序?
- 如何动态生成自定义类的变量,而且能全局使用??请高手近来细看!谢谢(老师验收程序急用)
- 请问,用什么函数可以随时取得鼠标的位置?
- 关于SDK的问题小弟求教了
- 关于钩子的问题 在线等
钩子基础~
本算法由Bresenham在1965年提出。设直线从起点(x1, y1)到终点(x2, y2)。直线可表示为方程y=mx+b。其中b = y1 - m * x1, m = 我们的讨论先将直线方向限于1a象限(图2.1.1)在这种情况下,当直线光栅化时,x每次都增加1个单元,即xi+1=xi+1而y的相应增加应当小于1。为了光栅化,yi+1只可能选择如下两种位置之一(图2.1.2)。图2.1.2 图2.1.2 yi+1的位置选择yi-1=yi 或者 yi+1=yi+1
选择的原则是看精确值y与yi及yi+1的距离d1及d2的大小而定。计算式为:y=m(xi+1)+b (2.1.1)d1=y-yi (2.1.2)d2=yi+1-y (2.1.3)如果d1-d2>0,则yi+1=yi+1,否则yi+1=yi。因此算法的关键在于简便地求出d1-d2的符号。将式(2.1.1)、(2.1.2)、(2.1.3)代入d1-d2,得d1-d2=2y-2yi-1=2(xi+1)-2yi+2b-1用dx乘等式两边,并以Pi=dx(d1-d2)代入上述等式,得Pi=2xidy-2yidx+2dy+dx(2b-1) (2.1.4)d1-d2是我们用以判断符号的误差。由于在1a象限,dx总大于0,所以Pi仍旧可以用作判断符号的误差。Pi-1为:Pi+1=Pi+2dy-2dx(yi+1-yi) (2.1.5)误差的初值P1,可将x1, y1,和b代入式(2.1.4)中的xi, yi而得到:P1=2dy-dx综述上面的推导,第1a象限内的直线Bresenham算法思想如下: 1、画点(x1, y2); dx=x2-x1; dy=y2-y1;计算误差初值P1=2dy-dx; i=1;2、求直线的下一点位置:xi+1=xi+1;if Pi>0 则yi+1=yi+1;否则yi+1=yi;3、画点(xi+1, yi-1);4、求下一个误差Pi+1;if Pi>0 则Pi+1=Pi+2dy-2dx;否则Pi+1=Pi+2dy;5、i=i+1; if i<dx+1则转2;否则end。Bresenham算法的优点是:1、不必计算直线之斜率,因此不做除法;2、不用浮点数,只用整数;3、只做整数加减法和乘2运算,而乘2运算可以用硬件移位实现。Bresenham算法速度很快,并适于用硬件实现。 由上述算法思想编制的程序如程序2.1.2。这个程序适用于所有8个方向的直线(图2.1.1)的生成。程序用色彩C画出一条端点为(x1, y1)和(x2, y2)的直线。其中变量的含义是:P是误差;const1和const2,是误差的逐点变化量;inc是y的单位递变量,值为1或-1;tmp是用作象限变换时的临时变量。程序以判断|dx|>|dy|为分支,并分别将2a, 3a象限的直线和3b, 4b象限的直线变换到1a, 4a和2b, 1b方向去,以求得程序处理的简洁。void line (x1, y1, x2, y2, c)int x1, y1, x2, y2, c;{int dx;int dy;int x;int y;int p;int const1;int const2;int inc;int tmp;dx=x2-x1;dy=y2-y1;if (dx*dy>=0) /*准备x或y的单位递变值。*/ inc=1;elseinc=-1;if (abs(dx)>abs(dy)){ if(dx<0){ tmp=x1; /*将2a, 3a象限方向*/ x1=x2; /*的直线变换到1a, 4a*/ x2=tmp; tmp=y1; /*象限方向去*/ y1=y2; dx=-dy; dy=-dy; } p=2*dy-dx; const1=2*dy; /*注意此时误差的*/ const2=2*(dy-dy); /*变化参数取值. */ x=x1; y=y1; set_pixel(x, y, c); while (x<x2){ x++; if (p<0) p+=const1; else{ y+=inc; p+=const2; } set_piexl(x, y, c); }}else { if (dy<0){ tmp=x1; /* 将3b, 4b象限方向的*/ x1=x2; /*直线变换到2b, 1b */ x2=tmp; /*象限方向去. */ tmp=y1;y1=y2;dx=-dy;dy=-dy;}p=2*dx-dy; /*注意此时误差的*/const1=2*dx; /*变化参数取值. */const2=2*(dx-dy);x=x1;y=y1;set_pixel (x, y, c); while (y<y2){ y++; if(p<0) p+=const1; else{x+=inc;p+=const2;set_pixel (x, y, c);} }}
最好是安装钩子的时候,setwindowhookEx()最后一个参数为QQ登陆窗口的线程ID,你首先用
FindWindowEx(NULL, hQQ, "#32770", NULL);找到主窗口,然后用hBtn=GetDlgItem(hQQ, 0x69),那个hBtn就是你要找的QQ登陆窗口句柄了。然thread_id=GetWindowThreadProcessId(hBtn,NULL);得到QQ登陆窗口的线程ID。很好用的,我这是这样做的。