两进程间消息收发(有源码,帮调下,谢谢了)
现在的问题是,总收不到消息,不知为什么,以下代码是照着论坛里的例子做的,但为什么不行呢?哪个老大帮调下,谢谢了
发进程:
#define WM_MYMESS WM_USER+100
Button1 Click事件:
SendMessage(Form1->Handle,WM_MYMESS,0,0);
收进程:
.h文件
#define WM_MYMESS WM_USER+100
void __fastcall TForm1::receive(TMessage &msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MYMESS,TMessage,receive)
END_MESSAGE_MAP(TForm)
.cpp文件
void __fastcall TForm1::receive(TMessage &msg)
{
ShowMessage("收到消息");
}
问题点数:40、回复次数:7Top
1 楼setdefault(山转水也转)回复于 2005-08-04 09:02:28 得分 0
SendMessage(Form1->Handle,WM_MYMESS,0,0);
是否此处正确的指定了接收窗体的Handle?Top
2 楼FengSC(小猪快跑)回复于 2005-08-04 09:19:41 得分 0
这样写没错,可能是其他问题,我有个QQ群(12694434),你加进来把代码发给我,帮你看看。Top
3 楼constantine(飘遥的安吉儿)回复于 2005-08-04 09:25:49 得分 0
.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#define WM_COMM WM_APP+100
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TButton *Button2;
TButton *Button3;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
private:
bool ShowProcess(HWND Whandle); // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Windows.h"
#include "Messages.hpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND whd;
whd = FindWindow(NULL,"Receiver");
ShowProcess(whd);
::SendMessage(whd,WM_COMM,0,0);
}
//---------------------------------------------------------------------------
bool TForm1::ShowProcess(HWND Whandle)
{
//TODO: Add your source code here
bool rtn = false;
try{
ShowWindow(Whandle,SW_RESTORE);
SetForegroundWindow(Whandle);
SetActiveWindow(Whandle);
rtn = true;
}
catch(...)
{
}
return rtn;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
HWND whd;
whd = FindWindow(NULL,"Receiver");
ShowProcess(whd);
::SendMessage(whd,WM_COMM,0,1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
HWND whd;
whd = FindWindow(NULL,"Receiver");
ShowProcess(whd);
::SendMessage(whd,WM_COMM,1,0);
}
//---------------------------------------------------------------------------
接收的
.h
//---------------------------------------------------------------------------
#ifndef ReceiverH
#define ReceiverH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#define WM_COMM WM_APP+100
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
private:
void userpro(TMessage &msg); // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
protected:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_COMM, TMessage, userpro)
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Receiver.h"
#include "Windows.h"
#include "Messages.hpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void TForm1::userpro(TMessage &msg)
{
//TODO: Add your source code here
if(msg.WParam == 0 &&msg.LParam == 0)
Edit1->Text = "命令一";
if(msg.WParam == 0 && msg.LParam == 1)
Edit1->Text = "命令二";
if(msg.WParam == 1 && msg.LParam == 0)
Edit1->Text = "命令三";
}
Top
4 楼WindYou(WindYou)回复于 2005-08-04 09:47:53 得分 0
从代码上看,没有什么大问题。建议调试一下下面的代码,看FindWindow 返回的whd 是否是空值,如果是的话,就是你接受端的窗体名称不是"Receiver"。
HWND whd;
whd = FindWindow(NULL,"Receiver");
ShowProcess(whd);
::SendMessage(whd,WM_COMM,0,0);Top
5 楼titan_ysl(泰坦)回复于 2005-08-04 11:55:05 得分 0
楼主这段代码是两线程间消息收发用的。
看看 WM_USER 消息的说明,
WM_USER through 0x7FFF Integer messages for use by private window classes.
其它的进程是接收不到WM_USER消息的。
下面给出功能更强的,不同进程的数据传递方法(WM_COPYDATA消息)。
发送方:
.cpp File
void __fastcall TForm1::Button1Click(TObject *Sender)
{
COPYDATASTRUCT cds;
AnsiString Data=Edit2->Text;//"Just a test";
cds.dwData=sizeof(COPYDATASTRUCT);
cds.cbData=Data.Length();
cds.lpData=(LPVOID)Data.c_str();
HWND hWnd=::FindWindow(NULL,"接收方窗口的标题");
if(hWnd) ::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cds);
//向目标窗口发消息WM_COPYDATA
SendMessage(hWnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);
}
接收方:
.h File
protected:
virtual void __fastcall WndProc(TMessage &Message);
.cpp File
void __fastcall TForm2::WndProc(TMessag &Message)
{
if(Message.Msg==WM_COPYDATA)
{
COPYDATASTRUCT *cds;
char* DataBuf;
cds=(COPYDATASTRUCT*)Message.LParam;
DataBuf=new char[cds->cbData];
CopyMemory(DataBuf,cds->lpData,cds->cbData);
AnsiString Str=AnsiString(DataBuf);
Memo1->Lines->Add("Str="+Str);
delete[] DataBuf;
}
TForm::WndProc(Message);
}
Top
6 楼WYJBCB(阿菜)回复于 2005-08-04 16:58:39 得分 0
To FengSC(小猪快跑) :
我晚上回家后加你的群吧, 谢谢了
公司不让上网 ,真是郁闷Top
7 楼WYJBCB(阿菜)回复于 2005-08-06 21:39:38 得分 0
我用了各位老大的方法,但没有一个行,真是怪了,Top




