こんにちは。
Delphi 6を使用している者です。
今回の質問はあるexeファイルを実行した際、通常デスクトップに表示されるのを、自分で作成した子ウインドウに表示する方法があれば教えていただきたいです。
もしかしたらちんぷんかんぷんなことを言っているかも知れませんが、よろしくお願いします。
以下の例は、電卓を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;
以下が抜けてました^^;
hWndApp: THandle;
返信ありがとうございました。
この方法でうまくいきました。
ありがとうございます。
しかし、追加の質問があります。よろしければそちらのほうもお答え願いますでしょうか?
Panel1に電卓を表示させた後、例えば、プログラム内で1のボタンを押すということをしたいのですが、
おそらく、
TMsg.hWnd := hWndApp;
TMsg.Message := WM_LButtonUP;
TMsg.lParam := ****;
TMsg.wParam := ****;
と記述して、DispatchMessageでメッセージを送ればいいのだと思いますが、
その送り方がよく分かりません。おそらく、プロシージャーの設定等を
しなくてはいけないのだと思いますが・・・
また、そんな方法でなくてもできる方法があれば教えてください。
よろしくお願いします。
普通の電卓はこんな感じでボタンを押せますけど
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;
早速の返信ありがとうございました。
自分がやろうとしていることを電卓を例にしたのが
よくなかったみたいです。すみません。
自分がやろうとしていることは
Panel1に表示したexe実行画面の縦700pixel、横240pixel
の位置にあるボタンにクリックイベントをプログラム内で
生じさせたいのです。GetDlgItemではそのボタンのハンドルを
ゲットすることはできませんでした。
説明不足ですみませんでした。よろしくお願いします。
> GetDlgItemではそのボタンのハンドルをゲットすることはできませんでした。
ボタンといっても、本当の 'BUTTON' コントロール(子ウィンドウ)の場合と、
見せかけのボタン(VCLのTSpeedButton相当)がある。GetDlgItem() で
ハンドルが取得できるのは子ウィンドウの場合だけで、しかも ID が既知で
なければならい。マインスイーパやTSpeedButtonなどは、ボタンの絵ですから、
位置が分かっているなら、親ウィンドウに WM_LBUTTONDOWN と WM_LBUTTONUP
を送ればマウスでクリックしたことになるよ。
どっちのコントロールか確認しましたか?
子コントロールの場合は、スクリーン座標が分かれば WindowFromPoint() でもハンドル
が取得できるよ
> DispatchMessageでメッセージを送ればいいのだと思いますが、
それから、別アプリのウィンドウを子ウィンドウにしてもメッセージループは
別アプリのものを使っていますので、そのへん誤解なきように。
個人的には、そんな変なアプリは作りたくありませんし、使いたくありません。
ツイート | ![]() |