喫茶XRAYトップページ

[スレッド全体
]

[10975] 起動したアプリをTOPMOSTにする返信 削除
2017/3/28 (火) 18:53:24 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



[10984] Re:起動したアプリをTOPMOSTにする返信 削除
2017/3/29 (水) 12:49:20 Esper.SO
▼ Mr.XRAYさん
> [ShellExecuteで表示された画面が隠れないようにするには?]
> https://forums.embarcadero.com/thread.jspa?threadID=248197&tstart=0


そもそも、TOPMOSTにしないといけないんでしょうかね?
これって、他作業をしたい時、結構邪魔になるんですよね...

# ブラウザではなく、埋め込みブラウザにすれば解決!?

[11011] Re2:起動したアプリをTOPMOSTにする返信 削除
2017/4/3 (月) 12:44:37 Mr.XRAY
▼ Esper.SOさん

> # ブラウザではなく、埋め込みブラウザにすれば解決!?

今思い出したので... (^^;
TWebBrowse なんてのは,そのような目的にあるのではないかと.
新たなブラウザの開発用ではないですね.
しかしですね,彼の方にそのような提案をすると,
ものすごて言い訳というか,主張が返ってきます.
過去に何回かあります.最近は「このようにしたら」
と提案のようなことをレスする方はいなくなっていますね.

それだけ意志が強いということですね.
私のように,サイトの目次が見えないのがいいとか,
目次の部分がスクロールしないようにした方が... とか,
人に言われて変えてしまうような軟弱者ではないということですね (^^;
ハハハッ

# しかし,何で TOPMOST なウィンドウにするんだ  <-- しつこい !


[11012] サイトの記事のウリ返信 削除
2017/4/3 (月) 12:51:26 Mr.XRAY
> サイトの目次が見えないのがいいとか,

当サイトの売りは,目次の表示があること,
説明用の画像があること,
記事中にあるオンラインヘルプ等へのリンクが豊富,
なんだけどなぁ.

いえ,独り言です.ミミズのたわごとです.


[11013] Re:サイトの記事のウリ返信 削除
2017/4/3 (月) 13:07:13 Esper.SO
▼ Mr.XRAYさん
> > サイトの目次が見えないのがいいとか,

あれかなぁ?
記事がど真ん中に来ているのが見やすい!!とか?

# 目次があったほうが絶対いいんだけどなぁ(主観)


[11014] Re2:サイトの記事のウリ返信 削除
2017/4/3 (月) 15:03:59 Mr.XRAY
▼ Esper.SOさん

> あれかなぁ?
> 記事がど真ん中に来ているのが見やすい!!とか?


昔そういう要望があった時は,印刷する時に目次を印刷したくない,
というのでした.それで目次を表示しなければ,と思ってそうしました.

今回のは今となっては分かりません.
目次が非表示にならなくなっているけど,
表示しないようにできないか,というのでしたので.
でも,多分そんなところではないかと思います.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82