Einzelnen Beitrag anzeigen

Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Text in ein DBRichEdit einfügen per SendMessage()

  Alt 5. Feb 2021, 21:48
Hallo zusammen,
also, ich weiß inzwischen, dass es nicht so einfach ist einen Text an ein RichEdit zu senden.
Ich taste mich nun so langsam ran, erst mal mit dem RichEdit von WordPad.
Das Handle zu ermitteln wenn Wordpad im Vordergrund ist, ist kein Problem.
Ich habe folgenden Source der prinzipiell einen Text an ein RichEdit innerhalb meiner eigenen Anwendung sendet:

Delphi-Quellcode:
// Source von Dr. Peter Below
TYPE
  TMyRichEdit = TRichEdit;

TYPE
  TEditStreamCallBack = FUNCTION( dwCookie: Longint; pbBuff: PByte;
    cb: Longint; VAR pcb: Longint ): DWORD; STDCALL;

  TEditStream = RECORD
    dwCookie: Longint;
    dwError: Longint;
    pfnCallback: TEditStreamCallBack;
  END;


FUNCTION EditStreamInCallback( dwCookie: Longint; pbBuff: PByte;
  cb: Longint; VAR pcb: Longint ): DWORD; STDCALL;
VAR
  theStream: TStream;
  dataAvail: LongInt;
BEGIN
  theStream := TStream( dwCookie );
  WITH theStream DO
  BEGIN
    dataAvail := Size - Position;
    Result := 0; { assume everything is ok }
    IF dataAvail <= cb THEN
    BEGIN
      pcb := READ( pbBuff^, dataAvail );
      IF pcb <> dataAvail THEN // couldn't read req. amount of bytes
          result := 0; // E_FAIL;
    END
    ELSE BEGIN
      pcb := READ( pbBuff^, cb );
      IF pcb <> cb THEN
          result := 0; // E_FAIL;
    END;
  END;
END;

FUNCTION EditStreamOutCallback( dwCookie: Longint; pbBuff: PByte;
  cb: Longint; VAR pcb: Longint ): DWORD; STDCALL;
VAR
  theStream: TStream;
BEGIN
  theStream := TStream( dwCookie );

  WITH theStream DO
  BEGIN
    IF cb > 0 THEN
        pcb := WRITE( pbBuff^, cb );
    Result := 0;
  END;
END;

PROCEDURE GetRTFSelection( aRichEdit: TRichEdit; intoStream: TStream );
VAR
  editstream: TEditStream;
BEGIN
  WITH editstream DO
  BEGIN
    dwCookie := Longint( intoStream );
    dwError := 0;
    pfnCallback := EditStreamOutCallBack;
  END;
  aRichedit.Perform( EM_STREAMOUT, SF_RTF OR SFF_SELECTION, longint( @editstream ) );
END;

PROCEDURE PutRTFSelection( aRichEdit: TRichEdit; sourceStream: TStream );
VAR
  editstream: TEditStream;
BEGIN
  WITH editstream DO
  BEGIN
    dwCookie := Longint( sourceStream );
    dwError := 0;
    pfnCallback := EditStreamInCallBack;
  END;
  aRichedit.Perform( EM_STREAMIN, SF_RTF OR SFF_SELECTION, longint( @editstream ) );
END;
Ich weiß nun nicht, wie ich es hinbekomme, dass ich einen Text an ein RichEdit einer Fremd-Anwendung (Wordpad) gesendet bekomme.
Die Frage ist, wie ich das Control in der Fremd-Anwendung ansprechen kann. Das was ich habe ist das Handle dieses Controls. Die Procedure PutRTFSelection erwartet ein RichEdit.

Delphi-Quellcode:
PROCEDURE Tfrm_Main.WMHotKey( VAR Msg: TWMHotKey );
VAR
  SS: TStringStream;

  FUNCTION WORDPAD_finden_TEST: THandle;
  VAR
    Len: LongInt;
    Title: STRING;
    Main_Wnd, wndChild: THandle;
  BEGIN
    Result := 0;
    Main_Wnd := GetForegroundWindow;
    IF Main_Wnd <> 0 THEN
    BEGIN
      Len := GetWindowTextLength( Main_Wnd ) + 1;
      SetLength( Title, Len );
      GetWindowText( Main_Wnd, PChar( Title ), Len );
      IF ( Pos( 'wordpad', LowerCase( Title ) ) > 0 ) THEN
      BEGIN
        IF Main_Wnd <> 0 THEN
        BEGIN
          wndChild := FindWindowEx( Main_Wnd, 0, 'RICHEDIT50W', NIL );
          IF wndChild <> 0 THEN
          BEGIN
            Result := wndChild;
          END;
        END;
      END;
    END;
  END;

BEGIN
  TRY
    gc_my_DBRichEdit_Handle := WORDPAD_finden_TEST;
    IF ( Msg.HotKey = Hotkey_id ) AND ( gc_my_DBRichEdit_Handle > 0 ) THEN
    BEGIN
      SS := TStringStream.Create
        ( '{\rtf1\ansi\ansicpg1252\deff0\deflang2055{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}{\f1\fnil MS Sans Serif;}}\viewkind4\uc1\pard\ul\b\f0\fs24 Test\ulnone\b0\f1\fs16\par}' );
      TRY
        PutRTFSelection( RICHEDIT1, SS ); // <==== wie komme ich hier das Control von Wordpad angesprochen (RICHEDIT50W), anstelle meinem RichEdit1
      FINALLY
        SS.Free;
      END;

      ShowMessage( 'Handle-ID=' + IntToStr( gc_my_DBRichEdit_Handle ) );
    END;
  FINALLY
    //
  END;
END;

Vielen Dank für Hinweise!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen ( 5. Feb 2021 um 21:57 Uhr) Grund: Text deutlicher formuliert...
  Mit Zitat antworten Zitat