C++的进程间响应技术
吴小岭
在 Windows环境中,一个应用程序按指定方式响应另一个应用程序的解决方法一般是利用 DDE,这需要作出响应的一方提供DDE服务。但是,如果作出响应的一方没有这种服务,我们就没有别的办法了吗?当然有,那就是向应用程序发送消息,应用程序接收到标准的 Windows消息后,就会完成相应的操作。
要向应用程序发送消息,首先要得到它的窗口句柄,这可以通过两个 API函数 GetWindow和 GetWindowText来实现。首先用GetWindow函数遍历所有的 Windows窗口,再用 GetWindowText函数得到每个窗口的标题,如果得到的标题和我们想要查找的窗口的标题一样,就得到我们想要的窗口句柄了。应用程序的窗口是一个树状结构,每一个子窗口下还可能有子窗口,要得到所有子窗口的句柄,就要遍历整个树,为了实现这一点,我们在程序中用了一个简单的堆栈操作。有了具体的窗口句柄后 ,就可以通过发送消息实现我们想实现的操作。本文举了几个简单的例子,实现了一些比较常用的操作,如修改按钮或文本框中的文字,实现从一个程序控制另一个应用程序中的按钮单击等。
图 1是程序运行的主窗体画面:
下面是在 C++ Builder中实现的源程序部分代码:
单元文件 Unit1.cpp
# include <vcl.h>
# pragma hdrstop
# include“ Unit1.h”
# pragma package(smart_init)
# pragma resource“* .dfm”
TForm1* Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
}
void __fastcall TForm1::btnSearchClick(TObject* Sender)
{
搜索标题和 txtTitle中的文本相符合的窗口,把搜索到的窗口句柄放到 h_Wnd中 ,并把它的所有子窗口的句柄放到数组hWndArray中
char Search[128];
char ClassName[128];
HWND h_Child;
int currPos;
int cmpLen;
currPos=0;
lstClassName- >Clear();
lstControlText- >Clear();
memoReadWrite- >Clear();
h_Wnd=GetWindow(Form1- >