什麼時機會需要用到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
沒有留言:
張貼留言