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

Вниз

Сообщение другой программе.   Найти похожие ветки 

 
DenKop   (2002-04-11 13:35) [0]

Не принимает сообщение программа?!!
Посылаю вот так:

procedure TForm1.Button1Click(Sender: TObject);
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO
BEGIN
IF (IsWindowVisible(Wnd)) AND
(GetWindow(Wnd, gw_Owner) = 0) AND
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
THEN
BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
if (StrPas(buff)="Project1") then
begin
SendMessage(WND,1000000,0,0);
ShowMessage(StrPas(Buff)+" Handle="+IntToStr(wnd));
Exit;
end;
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
end;

Пытаюсь принять вот так:

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := AppMessage;
end;

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = 1000000 then ShowMessage(IntToStr(Msg.message));
end;

После посылки сообщения ничего не происходит.Не поскажет ли кто, что я делаю не правильно?


 
Игорь Шевченко   (2002-04-11 14:10) [1]

День добрый,

Application.OnMessage получает только те сообщения, которые поставлены в очередь по PostMessage. Сообщения по SendMessage туда не попадают.

С уважением, Игорь Шевченко


 
Song   (2002-04-11 15:05) [2]

2Игорь Шевченко © (11.04.02 14:10)
Да ну да! С чего это вдруг?


 
PVOzerski   (2002-04-11 15:07) [3]

А почему бы принимать не вот так:
type
tForm1=class
....
private
procedure MyCustomHandler(var Msg:tMsg);message 1000000;
end;
......
procedure tForm1.MyCustomHandler(var Msg:tMsg);
begin
ShowMessage(IntToStr(Msg.message));
end;


 
Игорь Шевченко   (2002-04-11 15:11) [4]

День добрый, Song,

С Help"а вестимо...

Use OnMessage to trap any or all Windows messages posted to all windows in the application. OnMessage occurs when an application receives a Windows message. OnMessage only receives messages that are posted to the message queue, not those sent directly with the Windows API SendMessage function.

С уважением, Игорь Шевченко


 
Song   (2002-04-11 15:34) [5]

Хорошо,
отлавливаю я WM_SYSCOMMAND в своей проге, например и обрабатываю SC_MINIMIZE;

И Вы всерьёз думаете что, если я сделаю SendMessage(Application.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0); у меня это сообщение не отловится? Бред. Всё работает.


 
Игорь Шевченко   (2002-04-11 16:13) [6]

День добрый, song,



if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
Handled := False;
if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end
else
FTerminate := True;
end;


Это единственное место, где вызывается обработчик OnMessage

Читаем Help:

The PeekMessage function checks a thread message queue for a message and places the message (if any) in the specified structure.

The SendMessage function sends the specified message to a window or windows. The function calls the window procedure for the specified window and does not return until the window procedure has processed the message. The PostMessage function, in contrast, posts a message to a thread"s message queue and returns immediately.

Еще какие-то источники требуются ? :-)

С уважением,


 
Song   (2002-04-11 16:22) [7]

Я Вам привёл пример. Он работает на 100%.


 
Song   (2002-04-11 16:25) [8]

И что ? Из этого "The function calls the window procedure for the specified window and does not return until the window procedure has processed the message" следует что SendMessage не посылает сообщения, так чтобы его можно было поймать на onMessage?


 
Игорь Шевченко   (2002-04-11 16:30) [9]

День добрый, Song,

Да, из этого следует :-) Раз SendMessage сообщения в очередь не помещает, значит вынуть их оттуда PeekMessage не может...

С уважением,


 
Song   (2002-04-11 16:36) [10]

"Функция вызывает "оконную" процедуру для выбранного окна, и не возвращает результата до тех пор пока не закончится генерация сообщения". И что?
2Игорь Шевченко © (11.04.02 16:30), с большим к Вам уважением, но чего Вы парите? Вы сами-то хоть пробовали?


 
Alx2   (2002-04-11 16:40) [11]

>Song © (11.04.02 16:36)
>"Функция вызывает "оконную"
именно оконную. сразу. напрямик. :)


 
Игорь Шевченко   (2002-04-11 16:42) [12]

День добрый, Song,

Пробовал.

SendMessage вызывает оконную процедуру непосредственно, а не через очередь сообщений, командой Call, если сообщения посылаются и получатся в одном процессе. OnMessage срабатывает только для выбранных из очереди сообщений, как в Help"е написано. Или в Help"е тоже парят ? :-)

С уважением,


 
Song   (2002-04-11 16:42) [13]

Хорошо Игорь, давайте с Вами сделаем вывод: "Вы не можете посылать сообщения через SendMessage - пользуйтесь PostMessage или Perform. А я могу - и всегда так делаю, исключение составляет только тот случай, когда что-то может висеть и результат от SendMessage не вернётся - о чём собственно выбранное Вами в хэлпе изречение и говорит". Остаёмся при своих мнениях.


 
Игорь Шевченко   (2002-04-11 16:46) [14]

День добрый, Song,

Посылать сообщения через SendMessage я могу, получать эти сообщения в событии OnMessage - не могу :-)

Еще раз из TApplication.OnMessage
"Note: OnMessage only receives messages that are posted to the message queue, not those sent directly with the Windows API SendMessage function."

Далее мы можем оставаться при своих мнениях :-)

С уважением,


 
Alx2   (2002-04-11 16:50) [15]

>Song © (11.04.02 16:42)
Игорь прав. OnMessage вызывается из обработчика очереди асинхронных сообщений. SendMessage в очередь не залазит. Оно ломится напрямик :)


 
Виктор Щербаков   (2002-04-11 16:54) [16]

to Song.
Тебе уже говорили Игорь Шевченко © и Alx2 ©, что SendMessage вызывает оконную процедуру напрямую. Значит в обработчик события, которое вызывается в рез. извлечения сообщения из очереди мы не попадем, хотя оконная процедура будет вызвана!
Это справедливо, если SendMessage вызывается для окна того же потока в контексте которого произведен вызов.


 
Набережных С.   (2002-04-11 17:22) [17]


> Виктор Щербаков © (11.04.02 16:54)


> Это справедливо, если SendMessage вызывается для окна того
> же потока в контексте которого произведен вызов.

Это справедливо в любом случае.


 
Song   (2002-04-11 17:32) [18]

Ok, значит я глупый и тупой.


 
DenKop   (2002-04-11 18:49) [19]

to Song > В сообщениях я не мастер, но вот что получил на практике из приведённого выше примера:
При посылке сообщения через SendMessage результата я никакого не обнаружил, а при посылке функцией PostMessage, программа приёмник ответила мне Message"ем. Т.е. в данном случае SendMessage не подходит.
All > Спасибо за разъяснения.

И ещё один интересный вопрос:
Почему WinSight не отлавливает сообщения от моей программы. Перепробовал все вышеперечисленные ф-ции(PreForm,SendMessage,PostMessage), но в списке сообщений своего сообщения я так и не увидел.


 
Fantasist   (2002-04-11 23:14) [20]

Что-то я не понял, это что, действительно новые постинги? Мне кажется я видел это месяца три-четыре назад(всю эту ветку). Кто глючит???


 
Alx2   (2002-04-12 07:33) [21]

>Song © (11.04.02 17:32)
Совсем еще не значит ;)


 
REA   (2002-04-12 11:13) [22]

Глючит модератор :)



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

Форум: "Основная";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
3-80810
MaXie
2002-04-05 12:20
2002.04.25
Как связать DBGrid с кириллицей?


3-80826
kserg@ukr.net
2002-04-05 12:30
2002.04.25
- как оперделить кол-во юзеров прицепившихся к БД?


3-80797
ПикулевЕвгений
2002-04-05 09:12
2002.04.25
Поиск по базе


1-80868
kopachev
2002-04-12 10:28
2002.04.25
Как программно менять значение Options в StringGride


14-81051
lipskiy
2002-03-19 19:16
2002.04.25
Как точно отследить сумму времени, проведенную в инете?





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