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


由于只能发送长整形的数据,所以,在程序中,你只能输入数字字符,而不能发送其它非数字字符。