掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
他のアプリケーションのeditフォームに対してテキストを送信するには? (ID:20478)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
他にもコーディングの方法があるかも知れませんが,参考のためやってみました. 動作確認は,Delphi7 Pro,WindowwsXP(SP2)で,受け取る側のアプリは,Delphi で作成したフォームにTEditを6個配置して行いました. 参考になれば幸いです. type TForm1 = class(TForm) Button1: TButton; Panel1: TPanel; procedure Button1Click(Sender: TObject); private { Private 宣言 } function GetFocusWindow(hTarget: HWND): HWND; public { Public 宣言 } end; var Form1: TForm1; FirstEditHandle : HWND; implementation {$R *.DFM} //var //============================================================================= // 子ウィンドウの列挙 // クラス名がTEditの最後のウィンドウを取得.これがTabオーダーでは最初のコント // となる(感覚的に逆) //============================================================================= function EnumChildProc(hWnd :integer;lData:LPARAM) : BOOL ;Stdcall; var Name :array[0..MAX_PATH] of Char; begin if IsWindowVisible(hWnd) then begin GetClassName(hWnd,Name,MAX_PATH); if (Name='TEdit') then begin FirstEditHandle:=hWnd; end; end; Result:=True; end; //============================================================================= // ハンドルがPH上の子ウィンドウのEditに,Tabオーダーの順に文字列をセット //============================================================================= procedure TForm1.Button1Click(Sender: TObject); var PH : HWND; CH : HWND; Str : String; i : Integer; begin FirstEditHandle:=0; PH:=FindWindow('TReceiveForm',nil); if PH<>0 then begin EnumChildWindows(PH,@EnumChildProc, 0); Str:='テスト文字列0'; CH :=FirstEditHandle; Windows.SetFocus(CH); SendMessage(CH,WM_SETFOCUS,0,0); SendMessage(CH,WM_SETTEXT,0,LPARAM(PChar(Str))); //GetFocusWindowの他の方法はクリップボード経由も考えられる for i:=1 to 5 do begin Str:='テスト'+IntToStr(i); //タブオーダーの次のコントロールにフォーカス移動 SendMessage(PH,WM_NEXTDLGCTL,0,0); //そのコントロールのハンドルを取得 CH:=GetFocusWindow(PH); SendMessage(CH,WM_SETTEXT,0,LPARAM(PChar(Str))); Application.ProcessMessages; end; end; end; //============================================================================= // 他アプリケーションのコントロールのハンドルは,コントロールのID値がわかれば // ID値から取得できるが,不明の場合はフォーカスのあるコントロールであればこの // 関数で取得できる. // GetForegroundWindowはトップウィンドウの取得,GetFocus単独では他のアプリの // 場合常に0が返ってくる.AttachThreadInputを使用するとフォーカスのあるウィン // ドウ(コントロール)のハンドルを取得できる //============================================================================= function TForm1.GetFocusWindow(hTarget: HWND): HWND; var dwTargetID: DWORD; dwActiveID: DWORD; begin //操作対象ウィンドウのスレッドを取得 dwTargetID := GetWindowThreadProcessId(hTarget,nil); //現在アクティブなウィンドウ(このアプリ)のスレッドを取得 dwActiveID := GetCurrentThreadId; //hTargetをZオーダのトップにしてアクティブに BringWindowToTop(hTarget); if AttachThreadInput(dwActiveID,dwTargetID,True) then begin //フォーカスウィンドウの取得 Result:=GetFocus; //アタッチを切離す AttachThreadInput(dwActiveID,dwTargetID,False); end else begin Result:=0; end; end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.