名前 題名 ▼ Mr.XRAYさん > [ShellExecuteで表示された画面が隠れないようにするには?] > https://forums.embarcadero.com/thread.jspa?threadID=248197&tstart=0 > > 相変わらず変わりませんな. > > 起動したアプリを最前面にするには,普通に ShellExecute 等で起動すれば, > 自動で最前面になります. > しかし,TOPMOST,つまり,Delphi でいうこところの TForm.FormStyle := fsStayOnTop > の状態にするには,SetWindowPos 関数で設定しないとなりません. > > ウィンドウを操作するには,そのウィンドウのハンドルが必要です. > ShellExecute で起動した場合,ウィンドウハンドルの取得が面倒なので, > ShellExecuteEx 関数を使用しています. > 詳しくは,ZIP ファイルをダウンロードして確認してください. > > > //============================================================================= > // 指定ブラウザのアプリでウェブページを表示 > // ブラウザは新規起動を前提としている > //============================================================================= > procedure TForm1.Button1Click(Sender: TObject); > var > LExeName : string; > LCmdLine : string; > LGetWndFlag : Boolean; > begin > LExeName := ''; > if RadioGroup1.ItemIndex = 0 then begin > LExeName := GetRelatedExeName('.html'); > end else > if RadioGroup1.ItemIndex = 1 then begin > LExeName := 'iexplore.exe'; > end else > if RadioGroup1.ItemIndex = 2 then begin > LExeName := 'firefox.exe'; > end else > if RadioGroup1.ItemIndex = 3 then begin > LExeName := 'chrome.exe'; > end; > > > LCmdLine := 'http://mrxray.on.coocan.jp/index.htm'; > > //アプリ起動 > LGetWndFlag := (FCurrentExeName <> LExeName); > FTargetWnd := RunExeFile(0, LExeName, LCmdLine, '', SW_SHOW, LGetWndFlag); > > if FTargetWnd > 0 then begin > FCurrentExeName := LExeName; > //Zオーダのトップに > SetHWND_TOPMOST_Window(FTargetWnd); > end; > end; > > //----------------------------------------------------------------------------- > // 指定したウィンドウをHWND_TOPMOSTにする > // これはDelphiで言えばTForm.FormStyle := fsStayOnTopと同じ > //----------------------------------------------------------------------------- > procedure TForm1.SetHWND_TOPMOST_Window(hWindow: HWND); > begin > SetWindowPos(hWindow, HWND_TOPMOST, 0, 0, 0, 0, > SWP_NOSIZE or SWP_NOMOVE or SWP_SHOWWINDOW); > end; > > > 当サイト (Habow 資料館のコードも含めて) に同様のコードがありますが, > メモ帳程度であればウィンドウハンドルの取得は,ネット上のコードで十分可能です. > ブラウザは,プロセスID が取得できても,実際にウィンドウハンドルが取得可能に > なるまでに時間がかかる場合があります. > そこで,以下の工夫をしています. > > > LWaitCount := 0; > LdwIDOrigin := GetProcessId(LShellExeInfo.hProcess); > > //最初のSleepを10にしてループ回数を大きな値にする > //重たいアプリの対応策 > repeat > Sleep(10); > LTargetWnd := LdwIDOrigin; > EnumWindows(@EnumTopWindow, LPARAM(@LTargetWnd)); > if LTargetWnd <> LdwIDOrigin then begin > Result := LTargetWnd; > break; > end; > Inc(LWaitCount); > until IsWindow(LTargetWnd) or (LWaitCount > 50000); > end; > > > ちなみに, > > >折角助言頂きましたが、私はWindowsAPIに精通しておりませんので、 > >すぐには役立てることができません。 > > プロとして,自分が開発したアプリを販売している立場の人が言うことではありません. > ハッキリ言って. > 精通も便通もありません. > いや,便通はあった方がいいです. > > サンプルのコードは,新規にブラウザを起動することを前提にしています. > Form1 の FormStyle の値は fsNormal となっていますが, > fsStayOnTop にしても動作します. > 例によって,動作確認は Windows7 U64(SP1) + Delphi XE(UP1) Pro です. > > しかし,何故 FormStyle := fsStayOnTop; なんだろう ? > > > [plBrowseURL_TOPMOST.zip] 544 KB > http://mrxray.on.coocan.jp/Delphi/zip/plBrowseURL_TOPMOST.zip > GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link