Шаг 116 - Посылка сообщений между программи

Итак, наша задача создать две программы. Одна будет сервер и будет посылать сообщения, а вторая будет клиент естественно и будет эти сообщения принимать. Итак, общая идея такова. Можно помылать сообщение используя HWND другого окна. Для этого есть функция SendMessage. Она пошлет любое сообщение любому окну, которому скажете. Отловить сообщение можно используя карту сообщения ON_MESSAGE. Давайте делать сервер.

Запускайте AppWizard, теперь создавайте приложение на базе диалогового окна отключив всё кнопки для простоты. На диалоговом окне давайте сделаем кнопку. И процедуру по нажатию на неё тоже надо.

116.gif (2003 b)

Определим наше сообщение.

...........
#define WM_MYMESSAGE WM_USER+1

//////////////////////
// CServerDlg dialog
............
Теперь можно создавать код по нажатию на кнопку.
void CServerDlg::OnButton1() 
{
	HWND hwnd;
	hwnd=::FindWindow(NULL,"Client");
	if (hwnd  != NULL) 
	{
		::SendMessage(hwnd,WM_MYMESSAGE,0,0);
	}
} 
Первое, что я делаю это использую функции API, а не MFC. Для этого ставлю две точки.
// ЭТО ФУНКЦИЯ API !!!! а не перегруженная MFC
::SendMessage(hwnd,WM_MYMESSAGE,0,0);
Для посылки сообщения мне нужно найти окно клиента - это делает FindWindow. В первом параметре необходимо указать имя класса окна, которое указывается в CreateStruct при создании окна. Я его не указал. Второй параметр имя заголовка окна. Это грозит некоторой опасностью в случае, если имена заголовка окна будут совпадать, т.к. сообщение пошлется всем окнам с таким заголовком. Но это можно повернуть и в свою пользу. Вообщем я так сделал для простоты. А вы сами решайте. Если окно найдено ему можно послать сообщение SendMessage, указав кому мы какое сообщение посылаем. Я посылаю своё сообщение и без параметров. Вот и все теперь клиент.

Для клиента создадим тоже проект MFC AppWizard, но только без кнопки. Точно такой же. Опишем реакцию на наше сообщение.

BEGIN_MESSAGE_MAP(CClientDlg, CDialog)
	//{{AFX_MSG_MAP(CClientDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)
END_MESSAGE_MAP()
И функцию соотвественно.
class CClientDlg : public CDialog
{
// Construction
public:
	void OnMyMessage();
	//......
};

И её реализация естественно.

void CClientDlg::OnMyMessage()
{
	MessageBeep(-1);
}

Запускайте два приложения. Щелкайте по кнопке на сервере и клиент будет вам отвечать звуком. Вот они и нашли общий язык.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 19.02.2000