Сообщение другой форме
Знаю, что этот вопрос обсуждался не однакратно. Дайте простенький пример того, как послать текст из моего Edit в Edit на другой форме не входящий в мой проект. Caption другой формы и Edit на ней определить смогу.
Неужели никто не может помочь?
Делаю так.
HWND FF= FindWindow("TForm1", "FF");//Handle нужной формы
HWND ED=FindWindowEx(FF,NULL,"TEdit",NULL);//Handle Edit
SetWindowText(ED,"DDD");
Но ничего не происходит.
Если зделать
SetWindowText(FF,"DDD");
то паменяется Caption у формы
Неужели никто не может помочь?
Делаю так.
HWND FF= FindWindow("TForm1", "FF");//Handle нужной формы
HWND ED=FindWindowEx(FF,NULL,"TEdit",NULL);//Handle Edit
SetWindowText(ED,"DDD");
Но ничего не происходит.
Если зделать
SetWindowText(FF,"DDD");
то паменяется Caption у формы
Обсуждалось действительно много раз. Проблема вся в том что передается указатель на текст, и в адресном пространстве другой программы этот указатель не имеет смысла. Вот... А так полазь по форуму, тут где-то было то что тебе надо :)
Обсуждалось действительно много раз. Проблема вся в том что передается указатель на текст, и в адресном пространстве другой программы этот указатель не имеет смысла. Вот... А так полазь по форуму, тут где-то было то что тебе надо :)
А причем тут указатель?
Причем тут адресное пространство другой программы?
Куда по твоему передается "указатель на текст" при вызове SetWindowText?
В адресное пространство другого процесса? :)
Тогда как же работает весь механизм оконных сообщений?
Зачем вообще тогда нужна оконная система?
To mag23:
Проблема в чем-то другом. Возможно, невалидные HWND. Ты их проверял?
Если ты хочешь получить HWND стандартного контролла Edit, то уверяю тебя, класс стандартного контрола носит название не TEdit (это из Борланда), а EDIT.
Кстати, если ты задаешь вопрос в разделе Win32 API, то пиши "окно", а не "форма". В Windows (win32) нет никаких "форм", их придумал Борланд, чтоб путать начинающих программистов. :D
А причем тут указатель?
Причем тут адресное пространство другой программы?
Куда по твоему передается "указатель на текст" при вызове SetWindowText?
В адресное пространство другого процесса? :)
Тогда как же работает весь механизм оконных сообщений?
Зачем вообще тогда нужна оконная система?
Дык окно то принадлежит другой программе.
Сказано ж:
.
Если сообщением не передается указатель на текст (я имею ввиду конкретное WM_SETWINDOWTEXT) то тогда что ж по-твоему передается? :) А когда данное сообщение посылается окну другой программы указатель теряет смысл. Сча пороюсь в мануале. Пока ничем кроме примера доказать свои слова не могу :)
Из MSDN :
However, SetWindowText cannot change the text of a control in another application.
И еще, от-туда же:
To set the text of a control in another process, send the WM_SETTEXT message directly instead of calling SetWindowText
или, юзай SetDlgItemText(hWnd, uId,text)
В твоем случае:
SetDlgItemText(FF,GetDlgCtrlID(ED),"DDD")
Насчет SetWindowText:
Из MSDN :
However, SetWindowText cannot change the text of a control in another application.
И еще, от-туда же:
To set the text of a control in another process, send the WM_SETTEXT message directly instead of calling SetWindowText
или, юзай SetDlgItemText(hWnd, uId,text)
В твоем случае:
SetDlgItemText(FF,GetDlgCtrlID(ED),"DDD")
Хм, а ты пробовал их юзать (SetDlgItemText)? Интересно, помогает?
Хм, а ты пробовал их юзать (SetDlgItemText)? Интересно, помогает?
Помогает... А в чем, собственно, проблема?
Помогает... А в чем, собственно, проблема?
Нет проблемы :D Говорю - интересно :)
А причем тут указатель?
Причем тут адресное пространство другой программы?
Куда по твоему передается "указатель на текст" при вызове SetWindowText?
В адресное пространство другого процесса? :)
Тогда как же работает весь механизм оконных сообщений?
Зачем вообще тогда нужна оконная система?
To mag23:
Проблема в чем-то другом. Возможно, невалидные HWND. Ты их проверял?
Если ты хочешь получить HWND стандартного контролла Edit, то уверяю тебя, класс стандартного контрола носит название не TEdit (это из Борланда), а EDIT.
Кстати, если ты задаешь вопрос в разделе Win32 API, то пиши "окно", а не "форма". В Windows (win32) нет никаких "форм", их придумал Борланд, чтоб путать начинающих программистов. :D
Дейсвительно, каждый прцесс имеет собственное виртуальное адресное пространство, которое скрыто от других процессов.
Что же касается WM_SETTEXT, то процитирую товарища Рихтера:
Рассмотрим такой вызов:
SendMessage(FindWindow(NULL, "Calculator"), WM_SETTEXT, 0, (LPARAM) "A Test Caption" );
Вроде бы все достаточно безобидно определяется описатель окна Calculator и делается попытка изменить его заголовок на «A Test Caption». Но приглядимся к тому, что тут происходит. В lParam передается адрес строки (с новым заголовком), расположенной в адрес ном пространстве Вашего процесса. Получив это сообщение, оконная процедура программы Calculator берет lParam и пытается манипулировать чем-то, что, «по ее мнению», является указателем на строку с новым заголовком.
Но адрес в lParam указывает на строку в адресном пространстве Вашего процесса, а не программы Calculator. Вот Вам и долгожданная неприятность — нарушение доступа к памяти. Но если Вы все же выполните показанную ранее строку, все будет работать нормально. Что за наваждение?
А дело в том, что система отслеживает сообщения WM_SETTEXT и обрабатывает их не так, как большинство других сообщений. При вызове SendMessage внутренний код функции проверяет, не пытаетесь ли Вы послать сообщение WM_SETTEXT. Если это так, функция копирует строку из Вашего адресного пространства в проекцию файла и делает его доступным другому процессу. Затем сообщение посылается пото ку другого процесса. Когда поток-приемник готов к обработке WM_SETTEXT, он оп ределяет адрес общей проекции файла (содержащей копию строки) в адресном про странстве своего процесса. Параметру lParam присваивается значение именно этого адреса, и WM_SETTEXT направляется нужной оконной процедуре. После обработки этого сообщения, проекция файла уничтожается