名前 題名 ▼ Mr.XRAYさん > [ GetWindowでのオーナーフォームハンドルの取得について ] > https://www.freeml.com/delphi-users/5087/latest > > >メニュープログラムであるExeを起動させるとき、 > >それが既に起動済みならそれを前面に持ってくる処理を作成しています。 > >対象Exeが起動中かの判断はうまくいくのですが、 > >それが最小化されている場合元に戻す処理がうまく動作せず苦慮しています。 > > それ (EXE) を前面に持ってくるとか, > それ (EXE) を最小化とか元に戻すというのはないですね. > そういう操作の対象はウィンドウです. > 質問のタイトルにあるようにフォームですね. > 対象 EXE のメインフォームのクラス名が TTargetForm とします. > こんな感じでしょうか. > 動作確認は Windows 7 U64(SP1) + Delphi XE5(UP2) Pro VCL-32 です. > > > # 前面に持ってくる処理はできているのか ? > > > //============================================================================= > // 対象のウィンドウを最小化 > // 対象のウィンドウがメインフォームの場合は子フォームも最小化する > // > // ShowWindow(LhWindow, SW_MINIMIZE); は対象のウィンドウだけを最小化できる > // 他のアプリの子フォームだけを最小化する必要性はまずないだろう > //============================================================================= > procedure TForm1.Button1Click(Sender: TObject); > var > LhWindow : HWND; > LhOwner : HWND; > begin > // 対象のウィンドウハンドル > LhWindow := FindWindow('TTargetForm', nil); > LhOwner := GetWindow(LhWindow, GW_OWNER); > > // Delphi 7 以前で作成したアプリ等 > // MainFormOnTaskbar := False; のアプリの場合 > // Delphi 7 以前で作成したアプリでもメインフォームだけなら不要 > if LhOwner <> 0 then begin > LhWindow := LhOwner; > end; > if LhWindow <> 0 then begin > PostMessage(LhWindow, WM_SYSCOMMAND, SC_MINIMIZE, 0); > end; > end; > > //============================================================================= > // 最小化したウィンドウを元に戻す > // > // MainFormOnTaskbar := True; のアプリの場合 > // 元に戻してもこのアプリがアクティブのまま > // MainFormOnTaskbar := False; のアプリの場合 > // 元に戻すと対象のアプリがアクティブになる > > // 対象が子フォームの場合は表示位置がシステムのデフォルトの位置になる > // 上のコードでメインフォームを最小化した場合 > // 上のコードの実行前に最小化されている子フォームは元に戻らない > //============================================================================= > procedure TForm1.Button2Click(Sender: TObject); > var > LhWindow : HWND; > LhOwner : HWND; > begin > LhWindow := FindWindow('TTargetForm', nil); > LhOwner := GetWindow(LhWindow, GW_OWNER); > > // Delphi 7 以前で作成したアプリ等 > // MainFormOnTaskbar := False; のアプリの場合 > // Delphi 7 以前で作成したアプリでもメインフォームだけなら不要 > if LhOwner <> 0 then begin > LhWindow := LhOwner; > end; > if LhWindow <> 0 then begin > PostMessage(LhWindow, WM_SYSCOMMAND, SC_RESTORE, 0); > > // 前面に表示するなら,例えば > SetForegroundWindow(LhWindow); > end; > end; GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link