![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
отлов сообщений [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;