如何用PostMessage/SendMessage 发送字符串?
请问如何使用P/S 发送字符串?格式是怎么样的,应该如何写,请人指点一下.
例如我要把字符串"I LOVE YOU"作为参数,应该怎么写.
在消息处理函数里面应该怎么样提取?
假如我已经自定义了WM_MSG
问题点数:20、回复次数:6Top
1 楼Snow_Ice11111(雪上加冰)回复于 2006-05-03 22:18:27 得分 10
发送字符串用WM_COPYDATA消息就行了,何必自定义消息?下面是摘取我以前的笔记中的,供你参考一下:
1 发送消息的程序中比较简单,在要发送的地方加入如下代码就行了:
void CSendDlg::OnSend()
{
// TODO: Add your control notification handler code here
CString str="这是我要发送的给另外一个进程字符串。";
COPYDATASTRUCT myCopyDATA;
myCopyDATA.cbData=str.GetLength();
myCopyDATA.lpData=str.GetBuffer(0);
str.ReleaseBuffer();
HWND hwnd=::FindWindow(NULL,"Receive"); //假设目标程序窗口标题为"Receive"
if (hwnd)
::SendMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&myCopyDATA);
else
AfxMessageBox("目标程序没有运行。");
}
2 接收消息的程序(这里假设是基于对话框的工程)请按如下步骤来实现:
先给对话框类CReceiveDlg(如果你的接收程序为SDI工程的话,把CReceiveDlg类换成CMainFrame类)添加一个消息处理函数LRESULT OnReceive(WPARAM wParam,LPARAM lParam),代码如下:
LRESULT CReceiveDlg::OnReceive(WPARAM wParam,LPARAM lParam)
{
COPYDATASTRUCT *p = NULL ;
p = (COPYDATASTRUCT*)lParam;
CString strTemp;
memcpy(strTemp.GetBuffer((int)p->cbData),p->lpData,p->cbData);
strTemp.ReleaseBuffer();
AfxMessageBox(strTemp);
return 0;
}
接着再给工程设定刚才添加的函数OnReceive为WM_COPYDATA消息的响应函数,在ReceiveDlg.cpp文件中如下地方加入一行代码:
BEGIN_MESSAGE_MAP(CReceiveDlg, CDialog)
//{{AFX_MSG_MAP(CReceiveDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_COPYDATA,OnReceive) //只要添加这一行进行WM_COPYDATA消息映射
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
好了,现在分别运行两个程序,应该可以在A程序中给B程序发送消息了,B收到消息后会弹出个MessageBox来显示从A程序发送来消息了。Top
2 楼abuseyoudna1981()回复于 2006-05-03 22:22:14 得分 0
呵呵.上面的方法我会,只是我想知道如何在不用WM_COPYDATA消息,也可以发送字符串而已,可以不用这个消息也可以实现吗?Top
3 楼C200501111(cv)回复于 2006-05-03 22:25:56 得分 0
辛苦了Top
4 楼soaroc(会飞的猪)回复于 2006-05-03 23:17:19 得分 10
char buf[]="I LOVE YOU";
SendMessage(WM_MYMSG,(WPARAM)buf,0)
在消息响应函数中注意添加wParam和lParam参数,然后使用下面的转换
char *buf=(char *)wParam;Top
5 楼abuseyoudna1981()回复于 2006-05-03 23:33:44 得分 0
可以了.谢谢楼上所有同胞.
TO soaroc(会飞的猪):应该用char* buf="i love you"吧?如果不是.传到过去的时候,已经变成了其他不知名的东东.原理应该还是把字符串的地址给传过去了.Top
6 楼wjj888888(不赖)回复于 2006-05-04 00:24:41 得分 0
收藏一下Top




