Windows把0x400定義為WM_USER,。如果想定義自己的一個消息,可以在WM_USER上加上一個值:
#define WM_CONTROLPRINT WM_USER+1001
另一種自定義窗口消息的方法是用RegisterWindowsMessage()函數(shù)來注冊這個消息,。與在WM_USER上加上某個數(shù)相比,,它的好處是不必考慮所表示的消息標識符是否超出工程的允許范圍。如:
const UINT WM_CONTROLPRINT=RegisterWindowMessage("reg_data");
在接收消息的程序中,,需要對添加對應消息的響應處理函數(shù),并將消息和消息處理函數(shù)關(guān)聯(lián),,要不它不知道消息發(fā)給誰:
//函數(shù)定義,在//AFX_MSG中
afx_msg LRESULT OnControlPrint(WPARAM wParam,LPARAM lParam);
//函數(shù)實現(xiàn)
LRESULT CSendDlg::OnControlPrint(WPARAM wParam,LPARAM lParam)
{
}
//關(guān)聯(lián)映射,在BEGIN_MESSAGE_MAP中
ON_MESSAGE(WM_CONTROLPRINT,OnControlPrint)//使用WM_USER+1001定義的消息
ON_REGISTERED_MESSAGE(WM_CONTROLPRINT,OnControlPrint)//使用RegisterWindowMessage定義的消息
消息如何傳遞呢,?我們需要發(fā)送消息時,,可以使用PostMessage和SendMessage。這兩個消息發(fā)送函數(shù)不一樣的地方就是SendMessage發(fā)送完消息后會等待消息處理函數(shù)處理完成后返回,,PostMessage則不等待,。所以,可以說PostMessage是不可靠的,,實際運用中可以根據(jù)具體情況來確定用那一個,。這兩個函數(shù)的具體使用請查看MSDN。
如我向主窗體發(fā)送一個消息(第一個參數(shù)是接收消息的窗體句柄,,第二個參數(shù)是要發(fā)送的消息,,后邊兩個為隨消息發(fā)送的參數(shù)信息):
::SendMessage(AfxGetApp()->GetMainWnd()->m_hWnd,WM_CONTROLPRINT,NULL,0);
2,使用自定義消息在進程間通訊,;
我們可以用VC60建立兩個基于對話框的工程,,一個命名為Send,一個命名為Revice。
在Send對話框中添加一個名成為IDC_BUTTONSEND的按鈕,。
在SendDlg.h和ReviceDlg.g中都添加自定義消息,。消息實現(xiàn)進程間通信,需要在這兩個程序中定義或注冊相同的消息,,才能保證數(shù)據(jù)通信順利進行:
#define WM_CONTROLPRINT WM_USER+1001
在Send工程中添加IDC_BUTTONSEND按鈕的單擊處理事件,,并添加代碼:
void CSendDlg::OnButtonsend()
{
//獲取窗口句柄
CWnd *pWnd=CWnd::FindWindow(NULL,_T("Revice"));
if(pWnd==NULL)
{
AfxMessageBox("接收程序沒有運行!");
return ;
}
//發(fā)送消息
pWnd->SendMessage(WM_SENDYKDISABLE,NULL,0);
}
在Revice工程中添加WM_CONTROLPRINT 的處理函數(shù),關(guān)聯(lián)映射,,和上邊描述的過程一樣,,在處理函數(shù)中添加相應的處理代碼。這里就不多說了,!
進程間傳遞消息的實現(xiàn)方法
作者: 來源: 發(fā)布日期:2007-07-03
隨著我們開發(fā)的應用的日益復雜,,像以往那樣將所有功能坐在一個exe文件中情況越來越少,更多時候是整個應用由若干模塊,、甚至若干單獨的exe文件組成,,這就涉及到了模塊或進程間的通訊交互問題,,本文主要談談在進程間的信息傳遞方法,作為進一步探討進程間通訊方案的參考,。
1.使用用戶自定義消息在進程間傳遞消息,。
經(jīng)過一定時間的Win32開發(fā),大家對Windows Mobile平臺下的消息映射機制應該都比較清楚了,,除了系統(tǒng)已經(jīng)為我們設定的如WM_CREATE,、WM_PAINT這類消息外,還有一種特殊的WM_USER消息用于用戶自定義消息,。
定義格式如下:
#define WM_IAMHANDSOME WM_USER+1
然后同樣的對于WM_IAMHANDSOME同樣的將它映射到相應的處理函數(shù)上去,。
當需要使用激發(fā)該消息時,采用SendMessage函數(shù)發(fā)送一個WM_IAMHANDSOME即可,。下面談談在進程間如何進行用戶自定義消息的傳遞,。
例,假設兩個程序,,一個叫zoujielun,一個叫feiyuqing,,兩個程序進行一項操作,唱一首名叫《千里之外》的歌,。
其中即需要一個程序“唱”完后通知另一個程序接著“唱”,。
1)在兩個程序中都定義#define WM_YOUTURN WM_USER+10
2)在feiyuqing進程中加入對應WM_YOUTURN的映射:
const MSG_MAP_MAIN_S g_mainMsg[] =
{
//……
{WM_YOUTURN,OnYouturn},
//……
};
3)在zoujielun中向feiyuqing發(fā)送WM_YOUTURN的消息,代碼如下:
Sing(_T(“屋檐如懸崖風鈴如滄海我等燕歸來……”));
HWND findWindows=NULL;
findWindows= FindWindow(_T(“feiyuqing”), _T(“feiyuqing\"));
SendMessage(findWindows,WM_YOUTURN,0,0);
這樣,,即把消息發(fā)送給了feiyuqing進程,。
4)在feiyuqing中,對應的OnYouTurn做出相應處理即可,。
LRESULT OnYouTurn(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
Sing(_T(“我送你離開千里之外 ……”));
return 0;
}
這樣即實現(xiàn)了進程間通過自定義消息傳遞來進行通訊,,但是這樣的缺點是不能同時傳遞數(shù)據(jù),。假設feiyuqing因為年紀大了,,如果突然“失憶”了,不記得歌詞,,需要zoujielun不但告訴他該唱了,,還要告訴他該唱什么,這時就需要利用系統(tǒng)一個強大的消息WM_COPYDATA,。
2.使用WM_COPYDATA消息跨進程傳遞數(shù)據(jù)
在SDK中,,該消息對應的參數(shù)為:
WM_COPYDATA wParam = (WPARAM)(HWND) hwnd;
lParam = (LPARAM)(PCOPYDATASTRUCT) pcds; [Page]
關(guān)鍵在于第二個參數(shù),即一個COPYDATASTRUCT結(jié)構(gòu)的指針,。
該數(shù)據(jù)結(jié)構(gòu)的結(jié)構(gòu)如下:
typedef struct tagCOPYDATASTRUCT {
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;
第一個數(shù)據(jù)成員可以傳遞一個DWORD類型,,如果只是要在進程間傳一個DWORD類型的數(shù)據(jù),這里可以直接用這個成員傳遞,。
關(guān)鍵在第二,、三個數(shù)據(jù)成員,,第三個lpData即為欲傳遞的數(shù)據(jù)的指針,第二個cbData即為傳遞的數(shù)據(jù)大小,,以byte為單位,。
下面舉例,還是zoujielun和feiyuqing程序間的通訊,。
1)在feiyuqing進程中加入對應WM_COPYDATA的映射:
const MSG_MAP_MAIN_S g_mainMsg[] =
{
//……
{WM_COPYDATA,OnYouturn},
//……
};
2)在zoujielun中向feiyuqing發(fā)送WM_YOUTURN的消息,,代碼如下:
Sing(_T(“屋檐如懸崖風鈴如滄海我等燕歸來……”));
HWND findWindows=NULL;
findWindows= FindWindow(_T(“feiyuqing\"), _T(“feiyuqing\"));
TCHAR *sContent = new TCHAR[256];
wsprintf(sContent,_T(“我送你離開千里之外……\"));
COPYDATASTRUCT copyData;
copyData.cbData = _msize(sContent);
copyData.lpData = sContent;
SendMessage(findWindows,WM_COPYDATA,0,(LPARAM)©Data);
3)在feiyuqing中,對應的OnOnYouTurn做出相應處理即可,。
LRESULT OnYouTurn(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
TCHAR *sContent = NULL;
sContent =(TCHAR*)((COPYDATASTRUCT*)lParam)->lpData;
Sing(sContent);
return 0;
}
即收到該消息后從相應參數(shù)取出數(shù)據(jù)進行處理,。
SendMessage FindWindow
http://www.cnblogs.com/shengshuai/archive/2007/05/01/sendmessagefindexec.html
MFC中獲得各個類的句柄的總結(jié)
http://hi.baidu.com/mzyse/blog/item/74403501e1b97d001c9583f6.html
MFC中自由使用自定義消息
http://www./xbgs/archive/2008/12/17/69647.html