在VB程序间进行跨进程通信不是一件容易的事。我曾经见过许多的程序开发员试图通过各种各样的方法来完成这一工作,这些办法包括从将信息写入共享的文本文档或注册表键到使用成熟的activeX程序通信服务器。每一种办法都有缺点:以前的办法容易产生错误,而现在的这些方法又由于在服务器中呼叫每一个对象的时候都会发生跨进程操作,又使其效率变得非常低。有一个经过实践检验的方法是,将要跨进程的通信挂接到你自己的VB程序的消息序列中,同时倾听从其它进程中传来的自定义窗口消息,一种被大家称之为"子类"的技术。
我曾经描述过如何以及为什么在VB编程语言中要运用"子类",而且我还展示了如何使用视窗应用编程接口来将消息发送到你的应用程序以及解锁的隐藏控制功能中去。在本篇文章中,我会向大家解释如何才能向其他的应用程序发送消息以及如何发送消息才能解决跨进程的通信难题。同时,我还会给大家提供可再度使用的ActiveX DLL, Messenger.dll,来让各位在将自定义消息运用于自己的程序的时候尽可能的简单起来。
因为消息传送是Windows和在它上面运行的程序之间通信的最基本方式,任何窗口或者控制任何的应用程序都可以通过使用SendMessage或者相关的软件来发送消息。此外,那些标准的消息对于所有运行于Windows的应用程序都有着相同的含义。有了这两点,我们就能得出一个令人吃惊的结论:通过发送消息,人们可以轻而易举的控制任何的当前正在运行的应用程序,甚至还包括那些并不应该被别人操控的应用程序。举个例子来说:
发送消息到另一个窗口的关键并不取决于你的应用程序,而是取决于窗口句柄。Windows操作系统的应用编程接口有许多的功能能够重新得到特定的窗口句柄,其中最经常使用的一个就是FindWindow功能。这个功能能够在标题说明中找到基于文本的最高级别的窗口(lpWindowName),并且返回到它的窗口句柄。在VB编程语言中关于FindWindow是如下这么描述的:
Private Declare Function
FindWindow Lib "user32" _
Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
你能通过使用FindWindowEx来找到子窗体句柄,就象是一个表格中的特殊控制一样。