一种替代寻找窗口指针的新方式,传递消息

首先,在子窗口发送消息

	//下面一句是寻找接收窗口的句柄
	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;声明一下即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值