子ウインドウにexeファイルの実行画面を表示


HIDE  2005-05-11 00:39:44  No: 14724

こんにちは。
Delphi 6を使用している者です。

今回の質問はあるexeファイルを実行した際、通常デスクトップに表示されるのを、自分で作成した子ウインドウに表示する方法があれば教えていただきたいです。
もしかしたらちんぷんかんぷんなことを言っているかも知れませんが、よろしくお願いします。


deldel  2005-05-11 19:19:36  No: 14725

以下の例は、電卓をPanel1に貼り付けます。
勘違いなら、すみません。

var
  R: TRect;
  iwCW, iwCH: Word;
  WS: Longword;
begin
  hWndApp := FindWindow(PChar('SciCalc'), nil);

  GetWindowRect(hWndApp, R);
  iwCW := R.Right - R.Left;
  iwCH := R.Bottom - R.Top;
  MoveWindow(hWndApp, Screen.Width, Screen.Height, iwCW, iwCH, True);
  Application.ProcessMessages;

  WS := GetWindowLong(hWndApp, GWL_STYLE);

  SetWindowLong(hWndApp, GWL_STYLE, WS or WS_CLIPCHILDREN);
  Windows.SetParent(hWndApp, Panel1.Handle);

  SetWindowLong(hWndApp, GWL_STYLE, WS_CHILD);

  Windows.SetParent(hWndApp, Panel1.Handle);

  ShowWindow(hWndApp, SW_SHOWMAXIMIZED);

  MoveWindow(hWndApp, 0, 10, Panel1.Width, Panel1.Height, True);
end;


deldel  2005-05-11 19:20:29  No: 14726

以下が抜けてました^^;

  hWndApp: THandle;


HIDE  2005-05-12 00:54:47  No: 14727

返信ありがとうございました。
この方法でうまくいきました。
ありがとうございます。

しかし、追加の質問があります。よろしければそちらのほうもお答え願いますでしょうか?

Panel1に電卓を表示させた後、例えば、プログラム内で1のボタンを押すということをしたいのですが、
おそらく、

TMsg.hWnd := hWndApp;
TMsg.Message := WM_LButtonUP;
TMsg.lParam := ****;
TMsg.wParam := ****;

と記述して、DispatchMessageでメッセージを送ればいいのだと思いますが、
その送り方がよく分かりません。おそらく、プロシージャーの設定等を
しなくてはいけないのだと思いますが・・・

また、そんな方法でなくてもできる方法があれば教えてください。
よろしくお願いします。


りおりお  2005-05-12 02:12:27  No: 14728

普通の電卓はこんな感じでボタンを押せますけど

procedure TForm1.Button1Click(Sender: TObject);
var
  hWndApp,hControl:HWND;
begin
  hWndApp := FindWindow('SciCalc', nil);
  if hWndApp <> 0 then
    hControl := GetDlgItem(hWndApp,125); // 0 → 124 ... 9 → 133
  if hControl <> 0 then SendMessage(hControl,BM_CLICK,0,0);
end;


HIDE  2005-05-12 03:11:07  No: 14729

早速の返信ありがとうございました。

自分がやろうとしていることを電卓を例にしたのが
よくなかったみたいです。すみません。

自分がやろうとしていることは
Panel1に表示したexe実行画面の縦700pixel、横240pixel
の位置にあるボタンにクリックイベントをプログラム内で
生じさせたいのです。GetDlgItemではそのボタンのハンドルを
ゲットすることはできませんでした。

説明不足ですみませんでした。よろしくお願いします。


りおりお  2005-05-12 04:03:45  No: 14730

> GetDlgItemではそのボタンのハンドルをゲットすることはできませんでした。

ボタンといっても、本当の 'BUTTON' コントロール(子ウィンドウ)の場合と、
見せかけのボタン(VCLのTSpeedButton相当)がある。GetDlgItem() で
ハンドルが取得できるのは子ウィンドウの場合だけで、しかも ID が既知で
なければならい。マインスイーパやTSpeedButtonなどは、ボタンの絵ですから、
位置が分かっているなら、親ウィンドウに WM_LBUTTONDOWN と WM_LBUTTONUP
を送ればマウスでクリックしたことになるよ。

どっちのコントロールか確認しましたか?


りおりお  2005-05-12 04:06:38  No: 14731

子コントロールの場合は、スクリーン座標が分かれば WindowFromPoint() でもハンドル
が取得できるよ


りおりお  2005-05-12 04:12:08  No: 14732

> DispatchMessageでメッセージを送ればいいのだと思いますが、

それから、別アプリのウィンドウを子ウィンドウにしてもメッセージループは
別アプリのものを使っていますので、そのへん誤解なきように。

個人的には、そんな変なアプリは作りたくありませんし、使いたくありません。


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

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






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