Проблема с SendMessage (Delphi) - PullRequest
       7

Проблема с SendMessage (Delphi)

1 голос
/ 23 февраля 2011

Я отправляю сообщение внешней программе:

SendMessage(Handle, WM_CHAR, Ord('A'), 0);

Но я не знаю, как я могу получить это сообщение в другой программе? (с WndProc или что-то в этом роде) кто-нибудь может мне это объяснить?

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

Я использую следующий код в серии программ; одна программа запускает программы, и когда каждая программа завершает свою работу, они отправляют сообщение обратно в средство запуска, которое они закончили. Ключом к программе является использование параметра HWND_BROADCAST: сообщение отправляется всем работающим программам на компьютере, но, конечно, оно обрабатывается только теми, кто имеет правильный обработчик сообщений. В программе, которая должна отправить сообщение, напишите

SendMessage (HWND_BROADCAST, RegisterWindowMessage ('message'), 0, 0);

Очевидно, что вы бы заменили 'message' некоторой строкой, которая является константой в обеих программах (той, которая отправляет, и той, которая получает).

Я не рекомендую использовать параметр lparam SendMessage для передачи данных в принимающую программу; это должен быть указатель, и, конечно, указатель на данные в программе 1 будет указывать на мусор в программе 2. Можно привести longint к указателю и отправить его, который затем должен быть разыменован на принимающей стороне

В принимающей программе

type
 TWMMYMessage = record
 Msg: Cardinal;   // ( first is the message ID )
 Handle: HWND;    // ( this is the wParam, Handle of sender)
 Info: Longint;   // ( this is lParam, pointer to our data)
 Result: Longint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 wm_Launcher:= RegisterWindowMessage ('message')  
 // wm_launcher is a private member of TForm
 .
 .
 .
end;

procedure TForm1.DefaultHandler(var Message);
var
 ee: TWMMYMessage;

begin
 with TMessage (Message) do
  begin
   if (Msg = wm_Launcher) then
    begin
     ee.Msg:= Msg;
     ee.Handle:= wParam;
     ee.Info:= lParam;
     // Checking if this message is not from us
     if ee.Handle <> Handle then WmMyMessage(ee);
    end
   else inherited DefaultHandler(Message);
  end;
end;

procedure TForm1.WmMyMessage(var Msg: TWMMYMessage);
begin
 startbtnclick (nil)   // here we actually do something when the message is received
end;
2 голосов
/ 23 февраля 2011

Чтение Как отправить и обработать пользовательское сообщение Windows

Не проверенный код:

const

  WM_REFRESHSOMETHING = WM_USER + 6;

В форме, которая должна перехватить сообщение, вам нужно что-то вроде:

...
procedure WMRefreshsomething(var ppbMsg : TMessage); message WM_REFRESHSOMETHING;
...

procedure YourForm.WMRefreshsomething(var ppbMsg : TMessage);
begin
  //Actions...
end;

И тогда вы можете отправить сообщение как:

SendMessageToAll(Handle, WM_REFRESHSOMETHING, 0, 0);

Для всех форм, имеющих сообщение WM_REFRESHSOMETHING;

См. Этот компилируемый Пример

...