Форум: "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.037 c