Обмен сообщениями между процессами
От: Cheat  
Дата: 08.04.12 16:49
Оценка:
Добрый день/вечер!

Проблема состоит в следующем — на с++ необходимо забрать сообщение из EditBox одного процесса и передать используя SendMessage/PostMessage в другой процесс и вывести в EditBox.

Отправка сообщения:
case IDC_BUTTON1:
            HWND hwndReciver = FindWindow(NULL, L"Dialog_Reciver");
            char EditBoxText[256];
            GetWindowTextA(hWndEditBox, EditBoxText, 256);
            SendMessage(hwndReciver, WM_USER+1, 0, (LPARAM)(LPCTSTR)EditBoxText);
            return TRUE;
            break;


Прием:
case WM_USER+1:
        SetWindowTextA(hWndEditBox,(LPCSTR)lParam);    
        break;


Текст не устанавливается (хотя сообщение доходит и в lParam лежит 2880172 (изначально 111, как я понимаю надо передать указатель на 111 в памяти передатчика)).

Подскажите, что надо исправить для передачи сообщения.
Re: Обмен сообщениями между процессами
От: rus blood Россия  
Дата: 08.04.12 19:54
Оценка: +1
Здравствуйте, Cheat, Вы писали:

WM_COPYDATA
Имею скафандр — готов путешествовать!
Re: Обмен сообщениями между процессами
От: Privalov  
Дата: 09.04.12 07:46
Оценка:
Здравствуйте, Cheat, Вы писали:

А почему WM_USER? Я отправлял WM_SETTEXT, В случае с EditText работает нормально.


        char EditBoxText[256];

        hwndReciver = FindWindow(NULL, L"Dialog_Reciver");
        Sleep(50);  // Без этого почему-то у меня работало не всегда.
    SendMessage(hwndReciver, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)EditBoxText);
Re: Обмен сообщениями между процессами
От: pugv Россия  
Дата: 11.04.12 14:09
Оценка:
Здравствуйте, Cheat, Вы писали:

C>необходимо забрать сообщение из EditBox одного процесса и передать используя SendMessage/PostMessage в другой процесс и вывести в EditBox.


C>Отправка сообщения:

C>
C>case IDC_BUTTON1:
C>            HWND hwndReciver = FindWindow(NULL, L"Dialog_Reciver");
C>            char EditBoxText[256];
C>            GetWindowTextA(hWndEditBox, EditBoxText, 256);
C>            SendMessage(hwndReciver, WM_USER+1, 0, (LPARAM)(LPCTSTR)EditBoxText);
C>            return TRUE;
C>            break;    
C>


C>Текст не устанавливается (хотя сообщение доходит и в lParam лежит 2880172 (изначально 111, как я понимаю надо передать указатель на 111 в памяти передатчика)).


LPARAM — это всего лишь long (для Win32). Лежит там то, что вы туда положили, т.е. адрес строки в адресном пространстве первого процесса. Для второго процесса это число ничего не значит, по крайней мере, в его адресном пространстве по такому адресу искомой строки точно нет.
Есть недокументированные исключения (это к вопросу о том, почему работает WM_SETTEXT), но как маршалить LPARAM для Вашего WM_USER система точно догадываться не может.
Как уже советовали, используйте WM_COPYDATA.

З.Ы. Кстати, память под EditBoxText Вы выделяете на стеке, будьте осторожны — например для PostMessage Ваш код даже в пределах одного процесса опасен.
Re[2]: Обмен сообщениями между процессами
От: ononim  
Дата: 11.04.12 15:31
Оценка:
P>Есть недокументированные исключения (это к вопросу о том, почему работает WM_SETTEXT), но как маршалить LPARAM для Вашего WM_USER система точно догадываться не может.

To set the text of a control in another process, send the WM_SETTEXT message directly instead of calling SetWindowText.

(c)MSDN
Так что WM_SETTEXT документирован
Как много веселых ребят, и все делают велосипед...
Re[3]: Обмен сообщениями между процессами
От: kero Россия  
Дата: 11.04.12 17:54
Оценка:
Здравствуйте, ononim, Вы писали:

P>>Есть недокументированные исключения (это к вопросу о том, почему работает WM_SETTEXT), но как маршалить LPARAM для Вашего WM_USER система точно догадываться не может.

O>

O>To set the text of a control in another process, send the WM_SETTEXT message directly instead of calling SetWindowText.

O>(c)MSDN
O>Так что WM_SETTEXT документирован

Тем не менее — недокументированным здесь все-таки кое-что осталось, хотя и давно известно

Речь о "параллельном" использовании WM_S/GETTEXT и S/GetWindowText для стандартного класса Edit (ну, и msctls_statusbar32), без разницы — в своем или чужом процессе.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.