Форум: "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