问题描述
我做了2个程序A和B,A发消息,B接收A:[DllImport("User32.dll",EntryPoint="SendMessage")]privatestaticexternintSendMessage(inthWnd,//目标窗口的handleintMsg,//消息intwParam,//第一个消息参数refCOPYDATASTRUCTlParam//第二个消息参数);[DllImport("User32.dll",EntryPoint="FindWindow")]privatestaticexternintFindWindow(stringlpClassName,stringlpWindowName);publicstructCOPYDATASTRUCT{publicIntPtrdwData;publicintcbData;[MarshalAs(UnmanagedType.LPStr)]publicstringlpData;}constintWM_COPYDATA=0x004A;publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){intWINDOW_HANDLER=FindWindow(null,@"FrmReceive");if(WINDOW_HANDLER!=0){byte[]sarr=System.Text.Encoding.Default.GetBytes(textBox1.Text);intlen=sarr.Length;COPYDATASTRUCTcds;cds.dwData=(IntPtr)100;cds.lpData=textBox1.Text;cds.cbData=len+1;SnedMessage(WINDOW_HANDLER,WM_COPYDATA,0,refcds);}B:publicstructCOPYDATASTRUCT{publicIntPtrdwData;publicintcbData;[MarshalAs(UnmanagedType.LPStr)]publicstringlpData;}constintWM_COPYDATA=0x004A;publicreceive(){InitializeComponent();}protectedoverridevoidDefWndProc(refMessagem){if(m.Msg==WM_COPYDATA){COPYDATASTRUCTmystr=newCOPYDATASTRUCT();Typemytype=mystr.GetType();mystr=(COPYDATASTRUCT)m.GetLParam(mytype);switch(mystr.dwData.ToString()){case"100":textBox1.Text=mystr.lpData;break;case"200":textBox2.Text=mystr.lpData;break;}}base.DefWndProc(refm);}}现在用SendMessage测试成功,但把SendMessage改成PostMessage后,消息就无法传递了想请问下,如果要用PostMessage的话,应该怎么改呢?
解决方案
解决方案二:
PostMessage消息发出后不等消息函数处理完就执行它的下一语句SendMessage消息发出后阻塞等消息函数处理完执行它的下一语句其他地方没有区别的
解决方案三:
引用1楼jinjazz的回复:
PostMessage消息发出后不等消息函数处理完就执行它的下一语句SendMessage消息发出后阻塞等消息函数处理完执行它的下一语句其他地方没有区别的
是的,因为我现在是SERVER发给CLIENT,所以想用PostMessage,但上面代码改成PostMessage后,消息就是发不过
解决方案四:
mark
解决方案五:
试试WM_SETTEXT作为参数
解决方案六:
引用4楼jinjazz的回复:
试试WM_SETTEXT作为参数
不行,WM_SETTEXT作为参数是设置标题的....
解决方案七:
SendMessage把消息直接发送到窗口,并调用此窗口的相应消息处理函数,等消息处理函数结束后SendMessage才返回!SendMessage发送的消息不进入系统的消息队列;SendMessage函数有返回值PostMessage将消息发送到与创建窗口的线程相关联的消息队列后立即返回;PostMessage函数没有返回值;我用PostMessage把消息发到B后,B怎么去获得这个消息呢?
解决方案八:
顶上去,高手来解答下吧