两个进程或者说两个窗口程序之间如何交换信息呢?Windows提供了一个消息机制WM_COPYDATA,可以在两个窗口之间交换数据。WM_COPYDATA消息在两个窗口程序之间传递一个预定义的数据结构COPYDATASTRUCT。
typedef struct tagCOPYDATASTRUCT
{
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;
dwData为32位的自定义数据,lpData为指向数据的指针,cbData为lpData指针指向数据内存的大小(字节数)。
发送WM_COPYDATA消息只能用SendMessage而不能用PostMessage,原因是WM_COPYDATA发送的数据是以内存映射文件形式发送的,用PostMessage后内存映射文件的句柄会失效了,造成数据丢失。
发送方窗口程序(进程)的代码
class TForm1 : public TForm { __published: // IDE-managed Components
TEdit *edt1; TButton *btn1; void __fastcall btn1Click(TObject *Sender); private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner); char *cpSendStr,cSendStr[512]; COPYDATASTRUCT pCopyData; }; //-----------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { cpSendStr = cSendStr; cpSendStr = "Losng"; } //---------------------------------------------------------------------------
void __fastcall TForm1::btn1Click(TObject *Sender) { HANDLE fm; fm = FindWindow(NULL,"Recemess"); if (fm != NULL) { pCopyData.dwData = 0; if(edt1->Text != "") cpSendStr = edt1->Text.c_str() ; pCopyData.lpData = cpSendStr ; pCopyData.cbData = strlen(cpSendStr); SendMessage(fm,WM_COPYDATA,0,LPARAM)&pCopyData); } else ShowMessage("没有找到接收窗口!"); } //-----------------------------------------------------------------------
接收窗口程序(进程)代码
class TForm1 : public TForm { __published: // IDE-managed Components
TEdit *edt1; private: // User declarations
public: // User declarations
void __fastcall OnWMCopyData(TMessage &Msg); BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(WM_COPYDATA,TMessage,OnWMCopyData); END_MESSAGE_MAP(TForm) __fastcall TForm1(TComponent* Owner); }; //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { this->Caption = "Recemess"; } //---------------------------------------------------------------------------
void __fastcall TForm1::OnWMCopyData(TMessage &Msg) { char *cpSendStr,cSendStr[512]; cpSendStr = cSendStr; bool flag = false ; if ( Msg.Msg == WM_COPYDATA ) { COPYDATASTRUCT* pCopyData = (COPYDATASTRUCT* )Msg.LParam ; cpSendStr = (char *)pCopyData->lpData; edt1->Text = cpSendStr ; flag = true ; } if (!flag) { TForm::WndProc(Msg); } }