Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

отлов сообщений   Найти похожие ветки 

 
AlexeyM   (2004-10-20 01:44) [0]

нижеприведенным кодом пытаюсь поймать сообщение из одной проги в другой, но событие не доходит до получающей формы, только после того как сделал так: 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.


 
GanibalLector ©   (2004-10-20 01:48) [1]

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

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;


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

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


 
GanibalLector ©   (2004-10-20 02:02) [3]

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


 
GanibalLector ©   (2004-10-20 02:05) [4]

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


 
GuAV ©   (2004-10-20 02:07) [5]


> Надо так :

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


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

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


 
GanibalLector ©   (2004-10-20 02:55) [7]

Я тоже в 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 03:02) [8]

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


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

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

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

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


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

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


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

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


 
Jetus ©   (2004-10-27 23:44) [12]

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

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

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


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

Jetus ©   (27.10.04 23:44) [12]


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


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

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


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

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


 
Redhopter ©   (2004-10-31 08:02) [15]

Вот лови..код из 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;


 
Redhopter ©   (2004-10-31 08:05) [16]

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


 
AlexeyM   (2004-11-01 01:54) [17]

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



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

Текущий архив: 2004.12.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.037 c
4-1098688328
VZup
2004-10-25 11:12
2004.12.12
SetWindowText - не отправляется в Edit


9-1092668631
_YoungDelphin_
2004-08-16 19:03
2004.12.12
Помогите со спрайтами!


1-1101410329
Jolik
2004-11-25 22:18
2004.12.12
Нафига форме Owner?


4-1098222275
AlexeyM
2004-10-20 01:44
2004.12.12
отлов сообщений


3-1100174065
S@lik
2004-11-11 14:54
2004.12.12
Копирование таблици