Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Вниз

   Найти похожие ветки [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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.049 c
1-1089321907
SpyBack
2004-07-09 01:25
2004.07.25
Пароль


14-1088875636
Sanek_metaller
2004-07-03 21:27
2004.07.25
Мисс Вселенная 2004


1-1089705911
half_litre
2004-07-13 12:05
2004.07.25
Hint в формах из dll


1-1088397151
3fc
2004-06-28 08:32
2004.07.25
Ошибка при иcпользовании ListView


1-1089708229
ko
2004-07-13 12:43
2004.07.25
OnDeactivate





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский