Добрый день/вечер!
Проблема состоит в следующем — на с++ необходимо забрать сообщение из 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 в памяти передатчика)).
Подскажите, что надо исправить для передачи сообщения.
Здравствуйте, 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);
Здравствуйте, 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 Ваш код даже в пределах одного процесса опасен.
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 документирован
Здравствуйте, 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), без разницы — в своем или чужом процессе.