親ウィンドウを変更するには?

解決


ユウキ  2004-03-27 22:03:09  No: 7942

初めてここに書き込む、ユウキをいいます。よろしくお願いします。
早速質問ですが、、
まずここのFinderSystem.devというソフトをみてもらいたいなぁと思います。
http://www.h3.dion.ne.jp/~hanagex/dev/contents/soft/devtool/fsdev.html
このソフトの中の機能の「親ウィンドウの変更」をDelphiでやるにはどうしたらいいでしょうか?
それと環境は、Delphi6 Personalです。よろしくお願いします。
試しにメモ帳のウィンドウでサンプルを書いてくれるとうれしいです。
では。


Mr.XARY  URL  2004-03-27 22:36:13  No: 7943

>このソフトの中の機能の「親ウィンドウの変更」

提示されているURLを見ましたが,「親ウィンドウの変更」ってどんなこと
ですか.ダウンロードして見てみろ! ということですか.

>試しにメモ帳のウィンドウでサンプルを書いてくれるとうれしいです。

メモ帳に対してどんなことをしたいのですか.
以下は参考になりませんか.

他のウィンドウの操作の参考
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSetPrinter/OthesDialog.htm
http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N002.html


ふぐちゃん  2004-03-27 22:46:01  No: 7944

ハンドル名が...Mr.XARY...Mr.XRAY?
誤解していたらすみません。


ユウキ  2004-03-27 22:57:05  No: 7945

Mr.XARYさんへ。
すいません。お手数かけますが、できればダウンロードして
みていただいた方が一番わかりやすいと思ったので、、、、
簡単に言うと、表示されているウィンドウ(ここではメモ帳)のウィンドウを
そのままDelphiのFormの中に子ウィンドウとして取り込んでしまう
ということです。イメージ的には、MDIアプリケーションみたいな感じです。
(わかりにくかったらごめんなさい。)
それでは。


jok  2004-03-27 23:13:56  No: 7946

こんな感じでは?

procedure TForm1.Button1Click(Sender: TObject);
var
  hMemochou:HWND;
begin
  hMemochou := FindWindow('Notepad',nil);
  if hMemochou = 0 then exit;
  Windows.SetParent(hMemochou,Handle);
  MoveWindow(hMemochou,5,5,ClientWidth-10,ClientHeight-30,true);
end;


たかみちえ  URL  2004-03-27 23:42:24  No: 7947

> お手数かけますが、できればダウンロードしてみていただいた方が
  回答する方たちもいろいろとやることがありますので、ダウンロードをお願いするようなことはできませんね。
コードも基本的に、ヒントを得るのみで自分でできるのが理想かと。
# その方が実力もつきますし。

  さて、親ウィンドウを変更する方法は、jokさんの言うとおりで大体あっていると思います。
くわしくはSetParentをGoogleなどで検索してみればわかると思います。
逆に(親であるウィンドウハンドルを)参照するには、GetWindow APIを使います。

  さて、上の話を見た限りだと、
http://www.vector.co.jp/magazine/softnews/040114/n0401142.html
上記ソフトのようにしたいのだと思います。
  実際に件のソフトで親ウィンドウを変更してみるとわかりますが、
自分のプロセスでないウィンドウを取り込むと、
再描画のタイミングがおかしくなったり、元の親ウィンドウの破棄に対応できなかったり、
いろいろと問題が起こります。
# メモ帳のエディットウィンドウを、他のウィンドウ(デスクトップ以外)に移動させて、ぐりぐり振り回してみてくれればわかります。
そのことについても、留意する必要があると思います。
上に紹介したソフトは、グローバルフックをしているようです。

>Mr.XRAYさん
  遅ればせながら、リンクありがとうございますm(__)m


Mr.XRAY  URL  2004-03-27 23:53:55  No: 7948

私もちょっとやってみました.
Form1のボタンクリックでメモ帳を,Form1の中に表示します.
もし,タブの中に表示したければ,タブコントロールなどを配置して,
それをParentにしてみて下さい.
ただし,たかみちえさんが書かれている内容には注意が必要です.

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
     SI: TStartupInfo;
     PI: TProcessInformation;
     ExeName: String;
     NotepadWnd: HWND;
begin
     NotepadWnd:=FindWindow('Notepad',nil);
     {エクセルが起動中なら}
     if NotepadWnd<>0 then begin
     {起動していないなら起動する}
     end else begin
       ExeName:='NOTEPAD.EXE';
       GetStartupInfo(SI);
       CreateProcess(nil,PCharExeName),nil,nil,True,0,nil,nil,SI,PI);
       {起動終了まで待つ}
       while True do begin
         NotepadWnd:=FindWindow('Notepad',nil);
         if NotepadWnd<>0 then break;
         Application.ProcessMessages;
       end;
     end;
     Windows.SetParent(NotepadWnd,Handle);
     SetWindowPos(NotepadWnd,0,0,0,300,450,SWP_SHOWWINDOW);
end;

end.

>ハンドル名が...Mr.XARY...Mr.XRAY?
えっと,ハンドル名を一時的に変更しました(ウソです ~_^;).

>遅ればせながら、リンクありがとうございますm(__)m

前からちょくちょく参考にさせて頂いてはいたのですが,
DLするのが面倒なのであまり使っていませんでした.(^_^);
少し前にコードをDLさせて頂きました.大変参考となり,また勉強になり
ます.この掲示板の質問の内容のほとんどが,これらのコードで間に合っ
てしまいそうな感じですね.


Mr.XRAY  URL  2004-03-28 00:01:17  No: 7949

ゴメンなさい.

> {エクセルが起動中なら}

ウソです.前にエクセルをForm内に表示したいという質問があった時
に作成したものを,そのままメモ帳に修正したコードをUPして,この
コメント部分の修正を忘れました.


jok  2004-03-28 00:02:39  No: 7950

あれですね、はっきり言って、他プロセスがつくったウィンドウを自プロセスの
ウィンドウの子ウィンドウにするのは、キワモノソフトですね。わたしだったら、
絶対につくりません。(笑)


ユウキ  2004-03-28 00:03:50  No: 7951

皆さんとても親切に教えていただいてありがとうございました。
めでたく問題は解決しました。

Dear:たかみちえさん&Mr.XRAYさん
>回答する方たちもいろいろとやることがありますので、ダウンロードをお願いするようなことはできませんね。
たかみちえさんのいうとおりですね、すみませんでした。
今後から気をつけたいと思います。
それと余談ですが、リンク先のソフトなんですが、あんなものがあるとは思いませんでした。けっこうべんりそう(?)ですね。
ありがとうございました。

Dear:jokさん
問題のコードがあんなに短いものだったとは思いませんでした。
かなり長ったらしいコードと思ったら、全部併せても9行しかなかったですね。。
有効に活用させていただきます。ありがとうございました!


ユウキ  2004-03-28 00:08:59  No: 7952

追記:
ここのBBSは本当に更新が早いですね。
解決の文を書いていた間に3件も書き込みが追加されてました。

Mr.XRAYさんもサンプルコードを書いてくれたんですね!
ありがとうございました!


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

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






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