掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
別アプリケーションのRichTextの内容をコピーするには (ID:41923)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
おっ! DLLを使ったコードがUPされましたね. 私の方は,コールバックを使用しなくてもいいメッセージを見つけました. EM_SETTEXTEXというメッセージです. これだと,EM_STREAMINとEM_STREAMOUTの両方の機能があるようです. Delphiには定義がないので,その定義を追加しています. もちろん,プロセス間の通信ですから,共有メモリを使用することになります. まっ,そういうことでございます. 参考リンク EM_SETTEXTEX http://msdn.microsoft.com/en-us/library/windows/desktop/bb774284%28v=vs.85%29.aspx SETTEXTEX構造体 EM_SETTEXTEXメッセージのWParamに使用する構造体 http://msdn.microsoft.com/en-us/library/windows/desktop/bb787954%28v=vs.85%29.aspx 第8章 他のアプリのウィンドウ情報の取得 - 共有メモリ これを使用しました. http://mrxray.on.coocan.jp/Halbow/VCL08.html unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, RichEdit, ComCtrls; type TForm1 = class(TForm) RichEdit1: TRichEdit; RichEdit2: TRichEdit; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation uses CommonMemoryUnit; {$R *.DFM} type PSetTextEx = ^TSetTextEx; tagSetTextEx = record flags : DWORD; codepage : UINT; end; TSetTextEx = tagSetTextEx; SETTEXTEX = tagSetTextEx; const EM_SETTEXTEX = WM_USER + 97; ST_DEFAULT = 0; ST_KEEPUNDO = 1; ST_SELECTION = 2; ST_NEWCHARS = 4; ST_UNICODE = 3; //============================================================================= // 他のアプリのTRichEditにクリップボードを使用しないで転送 // // EM_SETTEXTEXメッセージを使用すると,EM_STREAMINとEM_STREAMOUTメッセードのよ // うにコールバック関数を使用しなくてもよい.しかも一回でよい // だたし,このメッセージはDelphi XEには定義がないので,必要な構造体とともに // 定義して使用 // // Halbow資料館の共有メモリクラスCommonMemoryUnitを利用 // // 動作確認環境 // Windows 7 U64(SP1) + Delphi 2007, Delphi XE //============================================================================= procedure TForm1.Button1Click(Sender: TObject); var hTargetApp : HWND; hRich : HWND; AStream : TStringStream; SetTextRec : TSetTextEx; CM : TCommMemNT; StrSize : Cardinal; StrText : AnsiString; begin //受信側のRichEditのハンドルを取得 hTargetApp := FindWindow(nil, 'TargetForm'); hRich := FindWindowEx(hTargetApp, 0, 'TRichEdit', 0); //TStringStreamを作成してRichEditの内容を保存 //これはリッチエディトの形式となっている AStream := TStringStream.Create(''); RichEdit1.Lines.SaveToStream(AStream); //ストリームのデータを文字列にしてAnsiString型に変換 //EM_SETTEXTEXのLParamの値はAnsiStringでなければならない StrText := AStream.DataString; StrSize := Length(StrText); //共有メモリクラスを生成 CM := TCommMemNT.Create(hRich, StrSize); try //共有メモリに転送データを格納 CM.Write(0, PChar(StrText), StrSize); //フラグを設定 SetTextRec.flags := ST_SELECTION; SetTextRec.codepage := DWORD(-1); //メッセージ実行 SendMessage(hRich, EM_SETTEXTEX, Integer(@SetTextRec), LPARAM(CM.MemPtr)); finally CM.Free; AStream.Free; end; end; end.
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.