いつも参考にさせていただいております。
フォーム上のボタンから別のExeを起動させます。
そのとき、同時にそのExe内に記述してある
TLabelのOnClickイベントを走らせるよう
メッセージを送りたいのです。
過去ログ等を見て
TLabelはデバイスコンテキストなので
TButton等の様にAPI関数FindWindowExではハンドルが
見つからない所までは分かりました。
ただ、具体的なハンドルの取得やメッセージの送り方は
発見出来なかったのでご助言いただければと思います。
ご指摘のように TLable にウィンドウハンドルはありません。ウィンドウでは
ないからです。ですからメッセージも送ることは出来ません。
LabelのOnを走らせるのではなく?
FormとかにUserMessage送ってOnClickキックは
嫌なんですか?
Exeを変更できないとか?
早速の回答ありがとうございます。
>>りおりお さん
やはり不可能なのですね...。
呼出側でBitMapを作成してウィンドウに表示するような
サンプルソースを多く見かけたので、
似たように出来るのではと思ってしまいました。
>>さわ さん
書込みを見てから気付きました。(汗)
ユーザ定義のメッセージを送受信すれば
同様の処理が可能ですね。
ちなみにExeの変更は特に問題はありません。
上記の処理をするソースを作ってみます。
無事に意図する処理が出来ました。
ありがとうございました。
余分かも知れませんが、以下に作成したサンプルを載せておきます。
------------------------------
// 自作メッセージ
const
WM_OPEN_MSG = wm_User + 10 ;
------------------------------
// 呼出側
procedure TForm1.Button1Click(Sender: TObject);
var
BufHWND :HWND ;
BufSI :TStartupInfo ;
BufPI :TProcessInformation ;
Ret :Boolean ;
ECode :Integer ;
begin
try
GetStartupInfo(BufSI) ;
Ret := CreateProcess("実行ファイルPath",
nil,
nil,
nil,
False,
CREATE_DEFAULT_ERROR_MODE,
nil,
nil,
BufSI,
BufPI
) ;
if not Ret then begin
ShowMessage('実行できません (' + IntToStr(GetLastError) + ')');
end
else begin
repeat
ECode := WaitForInputIdle(BufPI.hProcess,100);
Application.ProcessMessages;
until ecode = 0 ;
BufHWND := FindWindow(PChar("Exeのフォームクラス"),nil) ; // 指定ウィンドウのハンドル取得
SendMessage(BufHWND,WM_OPEN_MSG,0,0) ; // ウィンドウにメッセージ送信
end ;
except
end ;
end;
------------------------------
// Exe側
procedure ReceiveMessage(var Msg :TMessage); message WM_MY_MSG ;
procedure TFormExe.ReceiveMessage(var Msg :TMessage);
begin
Label1.OnClick(Self) ;
end ;
procedure TFormExe.Label1Click(Sender: TObject);
begin
MessageDlg('メッセージ受けました',mtInformation,[mbOk],0) ;
end;
起動直後になにかさせたいなら、CreateProcess のときコマンドラインパラメーを
付ければいいと思います
> コマンドラインパラメー
すみません。コマンドラインパラメータ です。起動されたアプリは ParamStr() を見て
なにかアクションを起こす、というのが普通の方法ではないでしょうか。
年越してからの遅いレスで申し訳ありません。
ヒントを頂いたParamStrを使って簡潔に実行時の処理を
記述出来ました。ありがとうございます。
以下、上記サンプルの修正箇所です。
// 呼出側修正
Ret := CreateProcess(nil, // 二行を修正
PChar("実行ファイルPath"+' /A'), //
nil,
…
) ;
//Exe 側
procedure TFormExe.FormShow(Sender: TObject);
var
i :Integer ;
begin
if ParamCount > 0 then begin
for i := 1 to ParamCount do begin
if ParamStr(i) = '/A' then begin
Label1.OnClick(Self) ;
end ;
end ;
end ;
end;
ツイート | ![]() |