对Windows编程一直很感兴趣,却因为能力和精力有限,每次都是学了点皮毛,然后又忘掉。 这次要做笔记,
准备集腋成裘。
1 Hook功能,是我一直最感兴趣的,记得第一次看到关于Hook功能的说明,让我兴奋不已,
作者不记得了,这个前辈说,可以写一小段程序,这小段程序启动后,当你打开你机器上的QQ的时候,
发现你得QQ今天很怪,用户名和密码的输入框都不能输入了。
原因是什么呢,就是我写的这一小段程序在监视QQ程序的状态,当QQ启动后,我的这段程序就能知道,
然后给QQ登录窗口发送一个消息,让QQ窗口上的用户号码和密码输入框不可用。
虽然看起来很简单,但对于新手来说,确实是个很大的难题。
因为在一般的PG来说,很少见过两个exe程序相互影响的。
说说思想吧,Windows是事件驱动的,我们所作的一切鼠标键盘操作,都是发给系统的,系统给具体对应的窗口发送消息,做出响应,正常期情况下,不同程序的窗口之间是不能够相互影响的,不然就乱了。
但是windows肯定会为高手留一个方法,让窗口之间可以通信,那就是使用nativewindow.
nativewindow关注重点:
1 NativeWindow类有个AssignHandle方法,当知道某个窗口的句柄(hwnd)时,可以通过这个方法将系统发给hwnd窗口的消息拦截下来,是否将消息告诉hwnd就取决于NativeWindow是否高兴了。
当然这个类还有个ReleaseHandle()方法,就是放弃自己拦截传向hwnd消息的权利。
如何拦消息,就是重写他的WndProc。
为了能够得到具体窗口的句柄,有以下几个方法,
1 FindWindow(IntPtr hwndParent, IntPtr hwndChild, string lpszClassName, string lpszWindowName),这个方法中的四个参数,就像SQL中的条件一样,知道的话就写上具体的,不知道的话,就写上0或者null,很方便。
2 EnumWindows 将枚举所有顶级窗口,但不枚举子窗口。
EnumChildWindows 函数既不会枚举由特定窗口拥有的顶级窗口,也不会枚举任何其他拥有的窗口。EnumThreadWindows 函数将枚举与某个线程关联的所有非子窗口。尽管所有窗口都有一个类,但并不是所有窗口也都有一个标题。
没有评论:
发表评论