Переслать текст в другую программуDelphi , ОС и Железо , Сообщения WindowsАвтор: Xavier Pacheco unit Readmain; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls; { The WM_COPYDATA Windows message is not defined in the 16-bit Messages } { unit, although it is available to 16-bit applications running under } { Windows 95 or NT. This message is discussed in the Win32 API online } { help. } const WM_COPYDATA = $004A; type TMainForm = class(TForm) ReadMemo: TMemo; MainMenu1: TMainMenu; File1: TMenuItem; Exit1: TMenuItem; Help1: TMenuItem; About1: TMenuItem; procedure Exit1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure About1Click(Sender: TObject); private procedure OnAppMessage(var M: TMsg; var Handled: Boolean); procedure WMCopyData(var M: TMessage); message WM_COPYDATA; end; var MainForm: TMainForm; implementation {$R *.DFM} uses RegMsg, AboutU; type { The TCopyDataStruct record type is not defined in WinTypes unit, } { although it is available in the 16-bit Windows API when running } { under Windows 95 and NT. The lParam of the WM_COPYDATA message } { points to one of these. } PCopyDataStruct = ^TCopyDataStruct; TCopyDataStruct = record dwData: DWORD; cbData: DWORD; lpData: Pointer; end; procedure TMainForm.OnAppMessage(var M: TMsg; var Handled: Boolean); { OnMessage handler for Application object. } begin { The DDGM_HandshakeMessage message is received as a broadcast to } { all applications. The wParam of this message contains the handle } { of the window which broadcasted the message. We respond by posting } { the same message back to the sender, with our handle in the wParam. } if M.Message = DDGM_HandshakeMessage then begin PostMessage(M.wParam, DDGM_HandshakeMessage, Handle, 0); Handled := True; end; end; procedure TMainForm.WMCopyData(var M: TMessage); { Handler for WM_COPYDATA message } begin { Check wParam to ensure we know WHO sent us the WM_COPYDATA message } if PCopyDataStruct(M.lParam)^.dwData = DDGM_HandshakeMessage then { When WM_COPYDATA message is received, the lParam points to} ReadMemo.SetTextBuf(PChar(PCopyDataStruct(M.lParam)^.lpData)); end; procedure TMainForm.Exit1Click(Sender: TObject); begin Close; end; procedure TMainForm.FormCreate(Sender: TObject); begin Application.OnMessage := OnAppMessage; end; procedure TMainForm.About1Click(Sender: TObject); begin AboutBox; end; end. unit CopyMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus; type TMainForm = class(TForm) DataMemo: TMemo; BottomPnl: TPanel; BtnPnl: TPanel; CloseBtn: TButton; CopyBtn: TButton; MainMenu1: TMainMenu; File1: TMenuItem; CopyData1: TMenuItem; N1: TMenuItem; Exit1: TMenuItem; Help1: TMenuItem; About1: TMenuItem; procedure CloseBtnClick(Sender: TObject); procedure FormResize(Sender: TObject); procedure About1Click(Sender: TObject); procedure CopyBtnClick(Sender: TObject); private { Private declarations } protected procedure WndProc(var Message: TMessage); override; public { Public declarations } end; var MainForm: TMainForm; implementation {$R *.DFM} uses AboutU, RegMsg; // The following declaration is necessary because of an error in // the declaration of BroadcastSystemMessage() in the Windows unit function BroadcastSystemMessage(Flags: DWORD; Recipients: PDWORD; uiMessage: UINT; wParam: WPARAM; lParam: LPARAM): Longint; stdcall; external 'user32.dll'; var Recipients: DWORD = BSM_APPLICATIONS; procedure TMainForm.WndProc(var Message: TMessage); var DataBuffer: TCopyDataStruct; Buf: PChar; BufSize: Integer; begin if Message.Msg = DDGM_HandshakeMessage then begin { Allocate buffer } BufSize := DataMemo.GetTextLen + (1 * SizeOf(Char)); Buf := AllocMem(BufSize); { Copy memo to buffer } DataMemo.GetTextBuf(Buf, BufSize); try with DataBuffer do begin { Fill dwData with registered message as safety check } dwData := DDGM_HandshakeMessage; cbData := BufSize; lpData := Buf; end; { NOTE: WM_COPYDATA message must be *sent* } SendMessage(Message.wParam, WM_COPYDATA, Handle, Longint(@DataBuffer)); finally FreeMem(Buf, BufSize); end; end else inherited WndProc(Message); end; procedure TMainForm.CloseBtnClick(Sender: TObject); begin Close; end; procedure TMainForm.FormResize(Sender: TObject); begin BtnPnl.Left := BottomPnl.Width div 2 - BtnPnl.Width div 2; end; procedure TMainForm.About1Click(Sender: TObject); begin AboutBox; end; procedure TMainForm.CopyBtnClick(Sender: TObject); begin { Call for any listening apps } BroadcastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE, @Recipients, DDGM_HandshakeMessage, Handle, 0); end; end.Скачать весь проект Код, который я предоставил, это проект Delphi, демонстрирующий отправку и получение данных между приложениями с помощью системы сообщений Windows. Вот подробное описание того, что каждый раздел кода делает: Unit Readmain Эта единица содержит основную форму приложения, которая отвечает за получение данных из других приложений. Форма имеет текстовый блок (ReadMemo), где будет отображаться полученная информация. Процедура Unit CopyMain Эта единица содержит еще одну основную форму (TMainForm), которая отправляет данные в другие приложения с помощью сообщения WM_COPYDATA. Форма имеет текстовый блок (DataMemo), где пользователь может ввести информацию, и два кнопки: Close и Copy. Процедура Как использовать Чтобы отправить данные из одного приложения в другое, выполните следующие шаги:
Текст, который был введен в первом приложении, должен теперь отображаться в текстовом блоке второго приложения. Замечание: код предполагает, что оба приложения запущены на одном компьютере и зарегистрированы друг с другом с помощью сообщения DDGM_HandshakeMessage. В статье описывается реализация механизма межпроцессного взаимодействия с помощью сообщения WM_COPYDATA в Delphi. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Сообщения Windows ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |