天天看點

Windows使用自定義消息實作程序之間通信

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版本,可能會出錯)。

由于隻能發送長整形的資料,是以,在程式中,你隻能輸入數字字元,而不能發送其它非數字字元。