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!