只要可以灵活的掌握消息的使用,你可以通自己的程序去控操作另一个程序;比如自动填写输入框,自动点击按钮,改变它窗口的显示信息,获取另一个程序上的显示信息,都不再是难事.
这一段时间我们陆续发布了一些开源小程序,当中多次用到了 SendMessage() 这个函数,我们前期开源的几篇如:
pro/e 无盘启动器
http://bbs.xkq.com/thread-10058-1-3.html
当U盘插入后作出反映
http://bbs.xkq.com/thread-10604-1-2.html
再谈修改软件界面标题的另类方法
http://bbs.xkq.com/thread-20097-1-1.html
且看网络风暴是怎么骗取超级用户密码的
http://bbs.xkq.com/viewthread.php?tid=10855
http://bbs.xkq.com/viewthread.php?tid=10857
当中也用到了如:SendMessage(TextHnd,WM_GETTEXT,256,integer(@Key))这样的语句,一位朋友曾在QQ 上提问关于第二个参数 WM_GETTEXT ,其实这个参数就是传说中的Windows消息;
Windows是一个消息(Message)驱动式系统,Windows消息提供了应用程序与应用程序之间、应用程序与Windows系统之间进行通讯的手段。应用程序要实现的功能由消息来触发,并靠对消息的响应和处理来完成。Windows系统中有两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。计算机的所有输入设备由 Windows监控,当一个事件发生时,Windows先将输入的消息放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中,应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。一个事件的发生,到达处理它的窗口函数必须经历上述过程。值得注意的是消息的非抢先性,即不论事件的急与缓,总是按到达的先后排队(一些系统消息除外),这就使得一些外部实时事件可能得不到及时的处理。
由于Windows本身是由消息驱动的,举一个例子来说明这个问题。打开某款无盘管理程序,该程序有一个"磁盘"菜单,那么,在运行该应用程序的时候,如果用户单击了"磁盘"菜单里"创建"命令时,这个动作将被Windows (而不是应用程序本身!)所捕获,Windows经过分析得知这个动作应该由上面所说的那个应用程序去处理,既然是这样,Windows就发送了个叫做WM_COMMAND的消息给应用程序该消息所包含信息告诉应用程序:"用户单击了创建磁盘菜单",应用程序得知这一消息之后,采取相应的动作来响应它,这个过程称为消息处理。Windows为每一个应用程序(确切地说是每一个线程)维护了相应的消息队列,应用程序的任务就是不停的从它的消息队列中获取消息,分析消息和处理消息,直到一条接到叫做WM_QUIT消息为止,这个过程通常是由一种叫做消息循环的程序结构来实现的。
只要我们编写的程序可以正确的截获或者发送相应的消息到另一个应用程序,你就能"自动"控制该程序;
比如我们在pro/e 无盘启动器,这个程序中,调用了一个PRO/E的注册机, 这个注册机需要在输入框中填写本机的MAC 地址,点击确定按钮,才能生成相应的许可证文件, 那么我们通过windows 的消息机制就可以通过程序全自动的完成这系操作,
1.获取本机MAC地址,这个不用说了很简单,存为一个字符串;
2.获得注册机上的输入框控件的句柄后,我们就可以通过 SendMessage(TextHnds[0],WM_SETTEXT,0,Integer(PChar(MacAddress))); 把MAC字符串填上去(发送上去);就如同你手工填写一样;
3.获得注册机上的"OK"按钮的句柄后,我们就可以用同样的方法把SendMessage(ButtonHnds[1],WM_LBUTTONDOWN,0,0);SendMessage(ButtonHnds[1],WM_LBUTTONUP,0,0);发送过去, 就可以达到你人工用鼠标点按钮一样的效果;
这些通通都是消息的往返;
<且看网络风暴是怎么骗取超级用户密码的> 一文中,我们用的也是 SendMessage(TextHnd,WM_GETTEXT,256,integer(@Key)), 不过中间的参数变成了 WM_GETTEXT ,也就是说我们不仅可以把字符串通过消息发送到另一个应用程序, 也可以把另一个应用程序中的文字消息(其实远不止是文字) 获取过来.
很多时候,当第三方的应用程序不向你开放接口,你又需要调用他的某些功能, 比如输入一些字符得到一些返回字符, 这样的情况大家平常都遇到过, 其实惯通理解了消息之后, 完全可以自己编写一个小工具,来全自动完成,
我们常用的几款国产无盘软件中都"集成"了远程控制功能,大家也都看出来了他们是在调用第三方的,但是不像平常一样需要输入IP地址和密码,一闪就进去了呢? 答案就在上面.
收集了一份Windows消息小全, 里面有大部分已知的Windows 消息,不全之处望大家补足
http://bbs.xkq.com/thread-20382-1-1.html
论坛讨论:
http://bbs.xkq.com/thread-20385-1-1.html
Tag: Windows消息 Message