Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

[wm_SetText] [D6, Win2k]


Kair ©   (2004-06-04 16:37:00) 

1. Получает ли окно данное сообщение при использовании по отношении к нему функции SetWindowText?
2. Необходимо ли в обработчике сообщения писать "inherited"?
Если не всегда, то в каких именно случаях?
3. При обработке данного сообщения для получения посланной строки надо:

procedure WMSetText();
begin
inherited; // про это идет речь в пункте 2
S := String(Msg.LParam);
end;

Так? Или помнится MBo говорил что-то про разные адресные пространства (если одно приложение изменяет текст окна у другого), т.е. строку получить не удастся...


Sirgfine   (2004-06-09 05:08:00) [1]

Функции SetWindowText и GetWindowText работают только внутри приложения. Для всего остального они не будут работать принципиально (в MS SDK написано) => надо посылать сообщения.
А не приходить они могут скорее всего потому, что ты Handle перепутал. Его надо точно указать, иначе ты посылаешь сообщение вникуда. Проверь с помощью WinSight приходит ли такое сообщение вообще (уходит ли такое сообщение вообще) возможно обнаружишь приятную неожиданность.


Sirgfine   (2004-06-09 04:53:00) [2]

т.е. ты создаёшь Button в RunTime?


Kair   (2004-06-06 10:44:00) [3]

В Create класса TButton создается окно
CreateWindowEx(0, 'Button', ...);
Думаю может это надо как-то через использование WndProc как в [2] показано. Но не получатеся связать WndProc с окном.


Kair   (2004-06-06 10:40:00) [4]

Спасибо конечно, но цель состоит не в обмене данными между приложениями.

Необходимо просто обрабатывать сообщение wm_SetText, которое может послать какое-нибудь приложение и изменять одно поле (переменную) в классе (типа FCaption := String(LParam))...
Вот что-то не получется это сделать...


Sirgfine   (2004-06-06 05:30:00) [5]

А как насчёт DDE-сервера?
Комоненты есть в delphi, а пример в любой книжке. Это более элегантный и правильный путь.
А с посылкой сообщений морока:
1) Тебе надо посылать сообщение именно этому окну (не окну в котором кнопка находится, а окну кнопки, а его Handle в свою очередь ещё надо найти...).
2)Потом тебе надо сообщение регистрировать, т.к. пересылать данные надо не с помощью стандартных windows сообщений, а с помощью своего.
3) Своё сообщение надо регистрировать с помощью RegisterWindowMessage  с определённоым номером WM_USER+n
4) Номер n в случае неудачи регистрации по заранее намеченому нужно каким-то образом передать принимающей программме, так как ловить она будет только сообщений с WM_USER+n номером.
5)... короче используй DDE сервер и DDE client. (могу отправить простой пример из книжки)


Kair   (2004-06-05 07:36:00) [6]

Ну, с этим ясно. А вот как мне обрабатывать сообщение из класса?
(см. [5]). TButton = class(TObject) например. Чтобы когда другое приложение посылает моему сообщение, то чтобы оно обрабатывалось в классе.
Как в [5] чета не обрабатывает... Наверное, я чего-то еще не знаю про это.

Мне нужно при получении сообщения менять одно свойство...


MBo   (2004-06-05 07:11:00) [7]

>Kair
Существует несколько сообщений, способных, грубо говоря, преодолевать межпроцессные границы - WM_COPYDATA и несколько, оставленных для совместимости со старыми программами - система обрабатывает их спец. образом-wm_settext из их числа.


Игорь Шевченко   (2004-06-05 00:30:00) [8]


> Исходя из примера, который привел BiN, выходит, что строку
> при обработке сообщения wm_SetText все-таки получить можно.
> Так?


Можно. А еще можно использовать WM_COPYDATA для пересылки данных между окнами различных приложений.


Kair   (2004-06-04 18:52:00) [9]

> BiN ©   (04.06.04 16:56) [2]

А если это в классе можно ли сделать такое:

TButton = class(...)
private
 procedure WMSetText(); message wm_SetText;
end;

И потом, ессесно, будет создана кнопка с таким классом на форме.
Работать будет? Сообщение кнопке идти будет?

P.S.: Это WinAPI приложение.

>> (если одно приложение изменяет текст окна у другого), т.е.
>> строку получить не удастся

> Переведи

Ну, то, что если из какого-то приложения послать это сообщение другому приложению, то поскольку в LParam передается адрес строки из посылающего приложения, и при обращении по этому адресу в принимающем сообщение приложении такой строки нет, то нельзя получить строку в переменную S в приведенном выше коде.
Но MBo говорил про другое сообщение, которое регистрировалось в системе с помощью функции RegisterWindowMessage (кажись так называлась), и там я пытался отправить текст приложению так:
SendMessage(Wnd, wm_MyMsg, 0, Integer(@S));

Исходя из примера, который привел BiN, выходит, что строку при обработке сообщения wm_SetText все-таки получить можно. Так?


BiN   (2004-06-04 16:58:00) [10]

вдогонку к [2]
SetWindowLong не забудь


BiN   (2004-06-04 16:56:00) [11]

1. да
2. исходя из тематики форума  - нет
3.
пишешь фукцию обработки сообщений твоего окна
function WndProc(H:HWND; Msg:UInt; WP:WPARAM; LP:LPARAM):LPARAM;stdcall;
var
 Text:Pchar;
begin
 //тут ты пишешь реакцию окна на посланное сообщение Msg
 //типа
 if Msg=WM_SETTEXT then
 begin
   Text:=Pchar(LP);
   WriteTextToFile(Text);
   Result:=0; //или 1
   Exit;
 end;
 Result:=DefWindowProc(H, Msg, WP, LP);
end


Игорь Шевченко   (2004-06-04 16:56:00) [12]


>  (если одно приложение изменяет текст окна у другого), т.е.
> строку получить не удастся


Переведи


VMcL   (2004-06-04 16:54:00) [13]

> 1. Получает ли окно данное сообщение при использовании по отношении к нему функции SetWindowText?

The SetWindowText function causes a WM_SETTEXT message to be sent to the specified window or control.


Наверх

Титульная страница Поиск, карта сайта Написать письмо