delphi高手们,请问如何接收另一个应用程序发来的自定义My_Msg_StkData,并响应函数OnStkDataOK()?给分!!!

解决方案 »

  1.   

    希望下面的代码对你有所帮助:
    unit CopyMain;interfaceuses
      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;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
        BufSize := DataMemo.GetTextLen + (1 * SizeOf(Char));
        Buf := AllocMem(BufSize);
        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;
          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
      BroadcastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
        @Recipients, DDGM_HandshakeMessage, Handle, 0);
    end;end.
      

  2.   

    uses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, Menus, StdCtrls;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
      PCopyDataStruct = ^TCopyDataStruct;
      TCopyDataStruct = record
        dwData: DWORD;
        cbData: DWORD;
        lpData: Pointer;
      end;procedure TMainForm.OnAppMessage(var M: TMsg; var Handled: Boolean);
    begin
      if M.Message = DDGM_HandshakeMessage then begin
        PostMessage(M.wParam, DDGM_HandshakeMessage, Handle, 0);
        Handled := True;
      end;
    end;procedure TMainForm.WMCopyData(var M: TMessage);
    begin
      if PCopyDataStruct(M.lParam)^.dwData = DDGM_HandshakeMessage then
        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 RegMsg;interfacevar
      DDGM_HandshakeMessage: Cardinal;implementationuses WinProcs;const
      HandshakeMessageStr: PChar = 'DDG.CopyData.Handshake';initialization
      DDGM_HandshakeMessage := RegisterWindowMessage(HandshakeMessageStr);
    end.