Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.25;
Скачать: CL | DM;

Вниз

   Найти похожие ветки [wm_SetText]

 
Kair ©   (2004-06-04 16:37) [0]

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

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

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


 
VMcL ©   (2004-06-04 16:54) [1]

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

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


 
BiN ©   (2004-06-04 16:56) [2]

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) [3]


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


Переведи


 
BiN ©   (2004-06-04 16:58) [4]

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


 
Kair ©   (2004-06-04 18:52) [5]

> 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 все-таки получить можно. Так?


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


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


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


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

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


 
Kair ©   (2004-06-05 07:36) [8]

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

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


 
Sirgfine   (2004-06-06 05:30) [9]

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


 
Kair ©   (2004-06-06 10:40) [10]

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

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


 
Kair ©   (2004-06-06 10:44) [11]

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.07.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.046 c
14-1088722657
kaif
2004-07-02 02:57
2004.07.25
Философские вопросы


3-1088553025
Alexey Leonchik
2004-06-30 03:50
2004.07.25
Перекодировка MS1251 -> KOI8-R


1-1089639576
mmb
2004-07-12 17:39
2004.07.25
Как залить + и - полупериоды графика разными цветами ?


1-1089454856
Tahion2
2004-07-10 14:20
2004.07.25
Помогите перевести код из Си в Делфи.


6-1085245111
Игорь Н.
2004-05-22 20:58
2004.07.25
Как обратится к web странице не используя Internet Explorer