...send data to another program by auto-drag&drop?

Author: Hagen Reddmann 

 

uses

  ShellAPI;

 

function MakeDrop(const FileNames: array of string): THandle;

// Creates a hDrop Object

// erzeugt ein hDrop Object

var

  I, Size: Integer;

  Data: PDragInfoA;

  P: PChar;

begin

  // Calculate memory size needed

  // berechne notwendig Speichergröße

  Size := SizeOf(TDragInfoA) + 1;

  for I := 0 to High(FileNames) do

    Inc(Size, Length(FileNames[I]) + 1);

  // allocate the memory

  // alloziere den speicher

  Result := GlobalAlloc(GHND or GMEM_SHARE, Size);

  if Result <> 0 then

  begin

    Data := GlobalLock(Result);

    if Data <> nil then

      try

        // fill up with data

        // fülle daten

        Data.uSize := SizeOf(TDragInfoA);

        P  := PChar(@Data.grfKeyState) + 4;

        Data.lpFileList := P;

        // filenames at the at of the header (separated with #0)

        // am ende des headers nun die filenamen getrennt mit #0

        for I := 0 to High(FileNames) do

        begin

          Size := Length(FileNames[I]);

          Move(Pointer(FileNames[I])^, P^, Size);

          Inc(P, Size + 1);

        end;

      finally

        GlobalUnlock(Result);

      end

    else

    begin

      GlobalFree(Result);

      Result := 0;

    end;

  end;

end;

 

function MyEnum(Wnd: hWnd; Res: PInteger): Bool; stdcall;

// search for a edit control with classname 'TEditControl'

// suche ein child fenster mit klassennamen 'TEditControl'

var

  N: string;

begin

  SetLength(N, MAX_PATH);

  SetLength(N, GetClassName(Wnd, Pointer(N), Length(N)));

  Result := AnsiCompareText('TEditControl', N) <> 0;

  if not Result then Res^ := Wnd;

end;

 

// Example: Open msdos.sys in Delphi's Editor window

// Beispiel: msdos.sys im Delphi Editor öffnen

procedure TForm1.Button1Click(Sender: TObject);

var

  Wnd: HWnd;

  Drop: hDrop;

begin

  // search for Delphi's Editor

  // suche Delphis Editor Fenster

  EnumChildWindows(FindWindow('TEditWindow', nil), @MyEnum, Integer(@Wnd));

  if IsWindow(Wnd) then

  begin

    // Delphi's Editor found. Open msdos.sys

    // Delphis editor gefunden, also öffne msdos.sys

    Drop := MakeDrop(['c:\msdos.sys']);

    if Drop <> 0 then PostMessage(Wnd, wm_DropFiles, Drop, 0);

    // Free the memory?

    // Speicher wieder freigeben?

    GlobalFree(Drop);

  end;

end;