Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
14-91536
Dudao
2003-04-11 05:27
2003.04.28
Opera


3-91231
Wedos
2003-04-11 07:51
2003.04.28
Ошибка при фильтрации


1-91358
Shirson
2003-04-15 15:44
2003.04.28
Команды MSWord и design mode


1-91385
Spartak
2003-04-15 12:10
2003.04.28
Убрать переход в режим асемблерного кода при отладке


1-91363
maxon
2003-04-15 12:17
2003.04.28
про предков





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский