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

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.043 c
6-1096905757
N.H.
2004-10-04 20:02
2004.12.12
Как можно провер., что стр-ца, откр. брауз-ом - это стр-ца ош-ки?


3-1100091715
denis24
2004-11-10 16:01
2004.12.12
insert into....select


1-1101739912
Rem
2004-11-29 17:51
2004.12.12
Создание глобальной переменной Application


3-1100599067
Algiz
2004-11-16 12:57
2004.12.12
Базы данных


14-1101105848
ИМХО
2004-11-22 09:44
2004.12.12
Слово об эмиграции





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