Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

отлов сообщений [D6, WinXP]


AlexeyM ©   (2004-10-20 01:44:00) 

нижеприведенным кодом пытаюсь поймать сообщение из одной проги в другой, но событие не доходит до получающей формы, только после того как сделал так: application.OnMessage:= form1.appmessagehandler; в form1.appmessagehandler; смог словить нужное событие. скажите что нужно сделать чтобы нижеприведенный код форма смогла обработать без form1.appmessagehandler;
{
 This is useful if you want to send a message from your DLL back
 to the calling application.
}

const
  MY_MESSAGE = WM_USER + 4242;

  type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    // Handler that receive the Message
   procedure MessageReceiver(var msg: TMessage); message MY_MESSAGE;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  txt: string;
begin
  txt := 'Hello World';
  SendMessage(Form1.Handle, MY_MESSAGE, 0, DWORD(PChar(txt)));
end;

// To receive this custom Message that is addressed to form1.handle
// you need a message handler.

procedure TForm1.MessageReceiver(var msg: TMessage);
var
  txt: PChar;
begin
  txt := PChar(msg.lParam);
  msg.Result := 1;
  ShowMessage(txt);
end;

end.


AlexeyM   (2004-11-01 01:54:00) [1]

по этому примеру тож пробовал, причем не важна посылка текста, просто если я делаю по вашему примеру то процедура в приложении которое должно получить не выполняется, хотя сообщения доходят до form1.appmessagehandler


Redhopter   (2004-10-31 08:05:00) [2]

Если не будет ловить, то в пропиши в Findwindow(nil,'Заголовок окна')...
Заголовок окна,если не знаешь, можешь в диспетчере задачь посмотреть(он вызывается Alt-Ctrl-Del)


Redhopter   (2004-10-31 08:02:00) [3]

Вот лови..код из WinAPI help(c)
Как передать строку другому приложению?

Использовать сообщение WM_COPYDATA.

приложение получатель:
...
TMyForm1 = class(TForm)
 private
   ...
   procedure ReceiveMessage (var Msg: TMessage); message WM_COPYDATA;
   ...
end;
...

implementation

...

procedure TMyForm.ReceiveMessage;
var
 pcd : PCopyDataStruct;
begin
 pcd := PCopyDataStruct(Msg.LParam);
 Caption := PChar(pcd.lpData);

end;

приложение отправитель:

procedure TFormXXX.Button1Click(Sender: TObject);
var
 cd : TCopyDataStruct;
begin
 cd.cbData := Length(Edit1.Text)+1;
 cd.lpData := PChar(Edit1.Text);
 SendMessage ( FindWindow('TMyForm1', nil),
       WM_COPYDATA,  0, LParam(@cd));
end;


colonel   (2004-10-30 14:41:00) [4]

А кто такой Петдольц :-) Хочу почитать. Где вять ?


Игорь Шевченко   (2004-10-27 23:59:00) [5]

Jetus ©   (27.10.04 23:44) [12]


> Так как в такой программе отловить посланное ей сообщение
> WM_COPYDATA от другой программы???


У тебя в оконном классе оконная процедура есть ? Вот в ней и лови WM_COPYDATA.

В воздух: И нафига народ на API пишет, если такие вопросы задает ? Хоть бы Петцольда почитали для развития.


Jetus   (2004-10-27 23:44:00) [6]

Ну... у меня консольное приложение, которое висит в памяти посредством

while GetMessage(Mesg, 0, 0, 0) do begin
   TranslateMessage(Mesg);
   DispatchMessage(Mesg);
 end;

Так как в такой программе отловить посланное ей сообщение WM_COPYDATA от другой программы???


BillyJeans   (2004-10-26 12:09:00) [7]

2 Jetus ©   (25.10.04 22:13) [10]
это как?


Jetus   (2004-10-25 22:13:00) [8]

А как на счет того, чтобы отловить сообщение в программе, написаной на чистом АПИ где нету форм?


Германн   (2004-10-20 04:21:00) [9]

2 AlexeyM   (20.10.04 03:02) [8]
Послать message из одной проги в другую - это как "два пальца об асфальт".

Но ведь тебе уже ответили "Как надо послать текст" в ту, другую прогу!

Только с помощью WM_COPYDATA можно реализовать сей сабж!


AlexeyM   (2004-10-20 03:02:00) [10]

спасибо за ответы GanibalLector, но мне надо послать мессагу в другое приложение
(внутри одной проги все работает)
плачу горькими слезами :(((


GanibalLector   (2004-10-20 02:55:00) [11]

Я тоже в private кидал но никакого эффекта, только до form1.appmessagehandler сообщения доходят

Бред какой-то...
Ну,вот тебе еще один пример :

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

 const  _mymessage = wm_user+318;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   procedure MyMessage(var Msg:TMessage);message _mymessage;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.MyMessage(var Msg: TMessage);
begin
Caption:=inttostr(Msg.LParam)+' '+inttostr(Msg.WParam);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
sendmessage(Form1.Handle,wm_user+318,WParam(random(100)),LParam(random(100)));
end;

end.


AlexeyM   (2004-10-20 02:45:00) [12]

Я тоже в private кидал но никакого эффекта, только до form1.appmessagehandler сообщения доходят :((


GuAV   (2004-10-20 02:07:00) [13]


> Надо так :

Лучше так, но не строго обязательно ;-)


GanibalLector   (2004-10-20 02:05:00) [14]

Кстати,только что досмотрелся на твой код.Надо так :
...
private
procedure MessageReceiver(var msg: TMessage); message MY_MESSAGE;
public
...


GanibalLector   (2004-10-20 02:02:00) [15]

хотя бы просто чтоб сообщение ловилось формой
Так оно и ловится.Это реальный пример,между прочим.
Единственное,так это FindWindow(имя_класса,текст) и все


AlexeyM   (2004-10-20 01:51:00) [16]

Так я тоже пробовал причем мне не важна доставка текста хотя бы просто чтоб сообщение ловилось формой


GanibalLector   (2004-10-20 01:48:00) [17]

-----------------------------------------------------------------
получатель:

procedure ReceiveMessage (var Msg: TMessage);
message WM_COPYDATA;
...
procedure TFormReceive.ReceiveMessage;
var
pcd: PCopyDataStruct;
begin
pcd := PCopyDataStruct(Msg.LParam);
Caption := PChar(pcd.lpData);
end;

отправитель:

procedure TFormXXX.Button1Click(Sender: TObject);
var
cd: TCopyDataStruct;
begin
cd.cbData := Length(Edit1.Text) + 1;
cd.lpData := PChar(Edit1.Text);
SendMessage(FindWindow('TFormReceive', nil), WM_COPYDATA, 0, LParam(@cd));
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо