Использование WM_COPYDATA только между процессами одного и того-же приложения
Я изучаю программирование под Win32. Хочу написать приложение которое может обмениваться сообщениями WM_COPYDATA между собственными экземплярами. Ниже приведен примерный код, как это делается исходя из многочисленных примеров.
Объявляем комманды:
enum COMMANDS { COMMAND1, COMMAND2, COMMAND3 };
Посылаем команду:
HWND hWnd = FindWindow(...);
if (hWnd != NULL) {
COPYDATASTRUCT cds = {0};
cds.dwData = COMMAND1;
SendMessage(hWnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds);
CloseHandle(hWnd);
}
Обрабатываем команды:
LRESULT Wndproc(HWND hWnd, UINT uMsg, WPARAM WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
...
case WM_COPYDATA:
COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam;
switch (pcds->dwData) {
case COMMAND1: ... ; break;
case COMMAND2: ... ; break;
case COMMAND3: ... ; break;
}
return TRUE;
...
}
return FALSE;
}
Однако есть один вопрос. На этапе посылки команды другому экземпляру приложения требуется знать HANDLE его окна. Для нахождения его в примерах используется функция FindWindow. Но как я понимаю, этот вариант не гарантирует уникальности. В связи с этим у меня несколько вопросов:
Правильно ли я понимаю, что теоретически, в системе могут существовать окна сторонних приложений с тем же классом и именем, если другой разработчик использовал схожие имена. И в таком случае
FindWindowтеоретически может вернуть описатели окон сторонних праложений иWM_COPYDATAотправится к сторонним приложениям. Конечно я понимаю, что вероятность не велика, но теоретически это же может приводить к сбоям, если и стороннее ОДНОИМЕННОЕ приложение как-то обрабатывает сообщенияWM_COPYDATA.Каким образом можно сделать, чтобы приложение находило только свои собстенные экземпляры запущенные в системе и гарарнтированно посылало сообщение
WM_COPYDATAлишь только им.