2013年4月15日 星期一

VC++ WM_COPYDATA的用法


什麼時機會需要用到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)&copydata);
}
//接收端
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

沒有留言:

張貼留言