什麼時機會需要用到WM_COPYDATA呢? 當你有兩個不同執行檔之間需要傳送資料且資料無法用一般變數
儲存時,也就是說資料量較大的時候,如字串、自己定義的資料結構、...。
WM_COPYDATA只能用SendMessage的方式傳送,不能用PostMessage,因為它要把資料傳給不同的執行檔
,得等到對方接收完資料後才能執行後面的程式,PostMessage的特性是傳送完之後就直接執行下面的
程式並不會理會對方是否執行完畢,因此並不適用WM_COPYDATA。
我寫了兩支測試程式,分別為:
testSendMsgA.exe (傳送端)
testSendMsgB.exe (接收端)
//自己定義的資料結構
typedef struct
{
char szName[40];
unsigned long ulID;
char szHotKey[40];
}HotKeyItem;
//傳送端
HotKeyItem item;
COPYDATASTRUCT copydata; //請參考MSDN將有詳給的說明
HWND hWnd = ::FindWindow(NULL,"testSendMsgB"); //去尋找testSendMsgB.exe的視窗
if(hWnd)
{
//設定資料
strcpy(item.szName,"test");
item.ulID = 101;
strcpy(item.szHotKey,"Ctrl+A");
copydata.cbData = sizeof(HotKeyItem);
copydata.lpData = &item; //把資料結構的位置傳給lpData
//傳送資料,到testSendMsgB.exe
::SendMessage(hWnd,WM_COPYDATA,(unsigned int)GetSafeHwnd(),(long)©data);
}
//接收端
1.接收端必需去攔截WM_COPYDATA的訊息
2.處理OnCopyData的訊息,如下:
BOOL Cxxx::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
char szMsg[1024];
HotKeyItem item; //宣告一個變數用來存放接收的資料
memcpy(&item,(HotKeyItem*)pCopyDataStruct->lpData,sizeof(HotKeyItem)); //複製資料
//把接收的資料用MessageBox秀出來..
sprintf(szMsg,"Name:%s ID:%u HotKey:%s",item.szName,item.ulID,item.szHotKey);
MessageBox(szMsg,"",MB_OK);
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
資料來源:http://tw.myblog.yahoo.com/noah_cjliao/article?mid=20&prev=-1&next=19
沒有留言:
張貼留言