Передача данных между двумя приложениями

Тема в разделе "Delphi", создана пользователем WinHack, 23 ноя 2016.

  1. WinHack
    Связь между двумя приложениями можно выполнить, используя механизм обмена сообщений Windows. Мы можем использовать значение HWND_BROADCAST как первый параметр для функции SendMessage.

    Для использования HWND_BROADCAST мы должны регистрировать наши сообщения в Windows.

    Для тестирования, поместите на форму 2 компонента TLabel и TButton, например, так:

    design-form-send-data.png
    Вот полный код для реализации этого:

    1. Определить тип структуры сообщения, как здесь:

    Код:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    { Определяем тип структуры сообщения }
    type
      TWMMYMessage = record
        Msg: Cardinal;   // (ID сообщения )
        Handle: HWND;    // ( wParam , Handle отправителя )
        Info: LongInt;   // ( lParam , указатель на данные )
        Result: LongInt;
    end;
    
    type
      TForm1 = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        // переопределяем метод DefaultHandler
        procedure DefaultHandler(var Message); override;
        procedure WMMYMessage(var Msg: TWMMYMessage);
      end;
    
    var
      Form1: TForm1;
      { Объявляем переменную сообщения }
      WM_OURMESSAGE: DWORD;
    
    implementation
    
    {$R *.dfm}
    
    { Реализация наших методов DefaultHandler }
    procedure TForm1.DefaultHandler(var Message);
    var
        ee: TWMMYMessage;
    begin
      with TMessage(Message) do
      begin
        if (Msg = WM_OURMESSAGE) then
        begin
          ee.Msg:= Msg;
          ee.Handle:= WParam;
          ee.Info:= LParam;
          // проверяем, если сообщение не от нас
          if ee.Handle <> Handle then
            WMMYMessage(ee);
        end
        else
          inherited DefaultHandler(Message);
      end;
    end;
    
    procedure TForm1.WMMYMessage(var Msg: TWMMYMessage);
    begin
      Label1.Caption:= Format('Дескриптор формы другого приложения : %d', [Msg.Handle]);
      Label2.Caption:= Format('Ширина формы другого приложения : %d', [Msg.Info]);
    end;
    
    { Добавляем сообщение }
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SendMessage(HWND_BROADCAST, WM_OURMESSAGE, Handle, Width);
    end;
    
    { Регистрируем наше сообщение }
    initialization
      WM_OURMESSAGE:= RegisterWindowMessage('Our broadcast message');
    end.
    Компилируем и запускаем две копии приложения и проверяем все функциональные возможности.

    design-form-send-data.png