Форум: "WinAPI";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];
ВнизPostMessage/SendMessage Найти похожие ветки
← →
AlexanderSK (2003-02-26 17:15) [0]Подскажите, пожалуйста, как через PostMessage/SendMessage передать строку (если это вообще возможно)?
← →
Clickmaker (2003-02-26 17:18) [1]Если б было невозможно, Винда бы не работала :)))
PostMessage(hwnd, WM_SETTEXT, 0, integer(pchar(Text)));
← →
DVM (2003-02-26 17:19) [2]Саму строку никак. Передавай указатель на строку в WParam или LParam своего (предварительно зарегистрированного) сообщения.
← →
DVM (2003-02-26 17:20) [3]Опоздал, блин... :)
← →
Polevi (2003-02-26 20:15) [4]>Clickmaker © (26.02.03 17:18)
не надо так делать
← →
Song (2003-02-26 21:03) [5]WM_COPYDATA
← →
AlexanderSK (2003-02-27 10:29) [6]>Polevi ©
А как надо?
← →
NAlexey (2003-02-27 12:23) [7]Ну можно так...
const
CM_UPDPANEL = WM_USER + 1;
procedure CMUpdPanel(var Message: TMessage); message CM_UPDPANEL;
где надо отправляешь...
lMsg := "Сообщение...";
SendMessage(Handle, CM_UPDPANEL, LongInt(@lMsg), 0);
ловишь...
procedure CMUpdPanel(var Message: TMessage);
begin
Panel.Caption:= String(Pointer(Message.WParam)^);
Panel.Update;
end;
← →
Игорь Шевченко (2003-02-27 12:52) [8]NAlexey © (27.02.03 12:23)
Это внутри одного приложения.
← →
AlexanderSK (2003-02-27 13:15) [9]>Игорь Шевченко
А как же между разными приложениями?
← →
Игорь Шевченко (2003-02-27 15:05) [10]Song © (26.02.03 21:03)
← →
pasha676 (2003-02-27 15:51) [11]2NAlexey
Еще одно замечание. Не по сути а по тексту примера.
> const
> CM_UPDPANEL = WM_USER + 1;
Никогда так не делай. Начинай свои сообщения с WM_USER+100
После номера WM_USER идут довольно много сообщений с зарезервироваными номерами. Например WM_CAP_SET_SCALE=WM_USER+53;
← →
Игорь Шевченко (2003-02-27 16:03) [12]pasha676 (27.02.03 15:51)
> Никогда так не делай
Никогда так не советуй, ибо ересь.
Цитата из Windows SDK:
Values in the range 0x0400 (the value of WM_USER) through 0x7FFF are available for message identifiers defined by an application for its own use.
← →
pasha676 (2003-02-27 17:19) [13]2Игорь Шевченко
Это так. Но описание описанием, но некоторые мультимидийные апи работают через месаги в диапазоне WM_USER - WM_USER+100.
Я просто сам так наколося. Это практический опыт, а не писанный в мануале.
Вот отрывок из интерфейсного модуля который юзает оверлейное видео:
.....
WM_CAP_START = WM_USER;
.....
WM_CAP_SET_CALLBACK_YIELD = (WM_CAP_START+ 4);
WM_CAP_SET_CALLBACK_FRAME = (WM_CAP_START+ 5);
WM_CAP_SET_CALLBACK_VIDEOSTREAM= (WM_CAP_START+ 6);
WM_CAP_SET_CALLBACK_WAVESTREAM = (WM_CAP_START+ 7);
WM_CAP_GET_USER_DATA = (WM_CAP_START+ 8);
WM_CAP_SET_USER_DATA = (WM_CAP_START+ 9);
WM_CAP_DRIVER_CONNECT = (WM_CAP_START+ 10);
WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START+ 11);
.....
И это далеко не полный список!!! Там дальше еще много такого (с небольшими дырами в этом модуле до 85 номера). И самое интересное, виндоуз действительно резервирует эти номера под видеоввод. Отрывок из Windows SDK по одной из функций:
The capDriverConnect macro connects a capture window to a capture driver. You can use this macro or explicitly send the WM_CAP_DRIVER_CONNECT message.
← →
Игорь Шевченко (2003-02-27 17:34) [14]pasha676 (27.02.03 17:19)
Но это значит только то, что некоторые приложения уже зарезервировали для себя ряд сообщений. И что с того ? Никто не запрещает СВОИМ окнам посылать сообщения WM_USER+0, WM_USER+1 и т.д.
← →
Юрий Зотов (2003-02-28 00:42) [15]> Игорь Шевченко
MSDN Library, April, 2001.
Message numbers in the second range (WM_USER through 0x7FFF) can be defined and used by an application to send messages within a private window class. These values cannot be used to define messages that are meaningful throughout an application, because some predefined window classes already define values in this range.
От себя добавлю - некоторые контролы из ComCtl32 точно используют этот диапазон. Наблюдал собственными глазами.
← →
Polevi (2003-02-28 09:30) [16]>AlexanderSK © (27.02.03 10:29)
procedure Test
var
Text:string;
begin
Text:="hello world";
PostMessage(hwnd, WM_SETTEXT, 0, integer(pchar(Text)));
end;
PostMessage посылает сообщение асинхронно, переменная Text уже не будет существовать к моменту обработки сообщения
Надо использовать SendMessage
← →
Игорь Шевченко (2003-02-28 09:38) [17]Юрий Зотов © (28.02.03 00:42)
Никто не запрещает СВОИМ окнам посылать сообщения WM_USER+0, WM_USER+1 и т.д. :-)))
> некоторые контролы из ComCtl32 точно используют этот диапазон.
Разумеется, например Toolbar.
Я толкую MSDN как недопустимость/нежелательность использования сообщений с этими номерами для широковещательной рассылки через Send/PostMessage (HWND_BROADCAST, ....)
Но если одно окно обрабатывает сообщение WM_USER+0, а другое ему посылает, то сообщение дойдет только до целевого окна, и попутно не застрянет в каком-то окне из comctl32, к примеру, которое его обработает нежелательным образом.
С уважением,
← →
AlekseyZ (2003-02-28 10:21) [18]А я сделал так, для передачи в ДРУГОЕ приложение небольшой строки
передаю побайтно:
for i := 1 to Length(S) do
SendMessage(H, WM_USER + 100, Ord(S[i]), 0); //
SendMessage(H, WM_USER + 100, 0, 1); // Признак конца строки
А в принимающей проге также побайтно считываю:
if Msg.LParam = 0 then begin // Добавляем пока не конец
s2 := s2 + Chr(Msg.WParam)
else
// s2 - переданная строка получена :)
Дешево и сердито :)
← →
Polevi (2003-02-28 11:05) [19]>AlekseyZ © (28.02.03 10:21)
недешево
← →
pasha676 (2003-02-28 11:45) [20]2Игорь Шевченко
> Но это значит только то, что некоторые приложения уже зарезервировали
> для себя ряд сообщений. И что с того ? Никто не запрещает
> СВОИМ окнам посылать сообщения WM_USER+0, WM_USER+1 и т.д.
>
Это значит, что если я вознамерюсь использовать функции, например, VfW, а у себя в программе буду использовать пользовательское сообщение на WM_USER+10, то у меня не будет работать capDriverConnect.
Вот сейчас открыл умный бук Тейксейре и Пачеко. У них в примере по пользовательским месагам стоит определение
const
SX_MYMESSAGE=WM_USER+100;
и есть такие строки
"Сообщение должно иметь идентификатор в диапазоне от WM_USER+100 до $7FFFF (этот диапазон Windows резервирует для сообщений пользователя)".
← →
Игорь Шевченко (2003-02-28 12:16) [21]Угу, цитата из MSDN October 2002:
"Any private application message must be defined above WM_USER + 0x100. A value above this will ensure that there is no collision between private messages and dialog box control messages."
Если получатель сообщения не "dialog box control", то ему никто не мешает принять сообщение, начиная с WM_USER. В самой системе управления окнами сообщения, начиная c WM_USER не используются.
Примеров много в исходниках VCL, кстати.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c