兩個進程或者說兩個窗口程序之間如何交換信息呢?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); } }