Windows使用自定義消息實作程序之間通信
Windows程式與其它類型程式的差別就是使用消息,例如鍵盤或滑鼠消息等,在dos系統下的程式沒有定義消息。在windows作業系統中,消息不但可以用于程序内的通信,也可以用于程序間的通信。而我這篇博文将講使用自定義消息實作程序間的通信。
我們都知道,在windows中消息分為兩種,即系統消息和使用者自定義消息,系統消息定義從0到0x3ff,可以使用0x400到0x7fff定義自己的消息。windows把0x400定義為WM_USER,如果想定義自己的一個消息,可以在WM_USER上加上一個值。當然了,還有另外一種方法,這裡就不講了,而是使用RegisterWindowsMessage()函數。
要想用消息實作程序間通信,則需要在這兩個程式中定義或注冊相同的消息,才能保證資料通信順利進行。
使用這種方式實作程序間通信,但是傳送的資料隻能是長整型的資料,不能是字元串。是以這個就是這種方式的局限。
定義完消息之後,可以使用如下的方法來發送消息:
Pwnd->SendMessage(WM_USER+0x401, NULL, (LPARAM)Msg)
參數代表的含義,在此就不多費口舌了,可以查閱MSDN。
好了,廢話不多說,上代碼:
SendDlg:
afx_msg LRESULT OnUserSendMsg(WPARAM wParam, LPARAM lParam); // 自定義的消息
BEGIN_MESSAGE_MAP(CSendDlgDlg, CDialog) ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_STRSEND, OnUserSendMsg)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, &CSendDlgDlg::OnBnClickedSendMsg)
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////// 發送資料
LRESULT CSendDlgDlg::OnUserSendMsg(WPARAM wParam, LPARAM lParam)
{
UpdateData(); // 更新資料
CWnd *pWnd = CWnd::FindWindow(NULL, _T("RecvDlg"));
if (pWnd == NULL)
{
AfxMessageBox(_T("無法找到接收視窗"));
return 0;
}
UINT uMsg;
uMsg = atoi(m_strSend);
pWnd->SendMessage(WM_STRSEND, NULL, (LPARAM)uMsg); // 發送消息
return 0;
}
RecvDlg類似,此處提供完整的項目工程下載下傳位址(注:項目工程使用vs2008 sp1建立的,如果使用别的vs版本,可能會出錯)。
由于隻能發送長整形的資料,是以,在程式中,你隻能輸入數字字元,而不能發送其它非數字字元。