TLabelのハンドルを取得するには?

解決


ベオルブ  2004-12-11 00:31:14  No: 12246

いつも参考にさせていただいております。

フォーム上のボタンから別のExeを起動させます。
そのとき、同時にそのExe内に記述してある
TLabelのOnClickイベントを走らせるよう
メッセージを送りたいのです。

過去ログ等を見て
TLabelはデバイスコンテキストなので
TButton等の様にAPI関数FindWindowExではハンドルが
見つからない所までは分かりました。

ただ、具体的なハンドルの取得やメッセージの送り方は
発見出来なかったのでご助言いただければと思います。


りおりお  2004-12-11 00:47:30  No: 12247

ご指摘のように TLable にウィンドウハンドルはありません。ウィンドウでは
ないからです。ですからメッセージも送ることは出来ません。


さわ  2004-12-11 00:55:45  No: 12248

LabelのOnを走らせるのではなく?
FormとかにUserMessage送ってOnClickキックは
嫌なんですか?
Exeを変更できないとか?


ベオルブ  2004-12-11 01:14:57  No: 12249

早速の回答ありがとうございます。

>>りおりお さん
やはり不可能なのですね...。
呼出側でBitMapを作成してウィンドウに表示するような
サンプルソースを多く見かけたので、
似たように出来るのではと思ってしまいました。

>>さわ さん
書込みを見てから気付きました。(汗)
ユーザ定義のメッセージを送受信すれば
同様の処理が可能ですね。
ちなみにExeの変更は特に問題はありません。

上記の処理をするソースを作ってみます。


ベオルブ  2004-12-11 02:45:32  No: 12250

無事に意図する処理が出来ました。
ありがとうございました。

余分かも知れませんが、以下に作成したサンプルを載せておきます。
------------------------------
// 自作メッセージ
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;


りおりお  2004-12-11 06:31:16  No: 12251

起動直後になにかさせたいなら、CreateProcess のときコマンドラインパラメーを
付ければいいと思います


りおりお  2004-12-11 06:33:05  No: 12252

> コマンドラインパラメー

すみません。コマンドラインパラメータ です。起動されたアプリは ParamStr() を見て
なにかアクションを起こす、というのが普通の方法ではないでしょうか。


ベオルブ  2005-01-05 21:08:10  No: 12253

年越してからの遅いレスで申し訳ありません。

ヒントを頂いた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;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加