首先,在子窗口发送消息
//下面一句是寻找接收窗口的句柄
HWND hWnd_CIFADSOC_1 = ::FindWindow(NULL, "要寻找的窗口名字");
if (hWnd_CIFADSOC_1 != NULL)
{
// 向目标窗口发送消息
//str1:想要发送的文本
COPYDATASTRUCT Data;
Data.dwData = 0;
Data.cbData = str1.GetLength();
//WM_TEST是自定义消息
Data.lpData = (void*)str1.GetBuffer(Data.cbData);
::SendMessage(hWnd_CIFADSOC_1, WM_TEST, 0, (LPARAM)&Data);
}
然后,在接收窗口处自定义消息
#define WM_TEST WM_USER+1
之后,根据类向导添加消息响应函数
最后,用函数来在主窗口里进行操作
afx_msg LRESULT CIFADSOC::OnTest(WPARAM wParam, LPARAM lParam)
{
//前两句是如何提取发送来的字符串
COPYDATASTRUCT* Data = (COPYDATASTRUCT *)lParam;
CString strRecievedText = (LPCSTR)(Data->lpData);
return 0;
}
这种情况适用于在子窗口无法获得主窗口句柄的时候
还有另一种方法,相对来说更加灵活一点,就是可以把句柄设置为全局变量,在想要接受的窗口初始化函数处给句柄赋值,但是要注意生成的顺序,有可能在句柄赋值以前已经有消息发出,但是没有收到。
更加灵活的是可以把发送函数封装起来成为全局函数,对于所有的类来说都可以随时调用。我用这个主要是为了让线程函数、定时器函数等可以随时向我设置的消息显示窗口发送消息,汇报实时状态。
//头文件里
extern void MsgRow(CString szMsg);
//源文件里
void MsgRow(CString szMsg)
{
if (DiaplayHwnd!=NULL)
{
COPYDATASTRUCT Data;
Data.dwData = 0;
Data.cbData = szMsg.GetLength();
Data.lpData = (void*)szMsg.GetBuffer(Data.cbData);
::SendMessage(DiaplayHwnd, WM_DISPLAYMESSAGE, 0, (LPARAM)&Data);
}
}
设定全局变量只要在一处的源文件里extern HWND DiaplayHwnd;设定好,其他地方只要在类外HWND DiaplayHwnd;声明一下即可