バッチファイルから start した時にウィンドウが背面に隠れてしまう問題に対処する

バッチファイルから start でアプリ(今回は mspaint)を起動すると、なぜかウィンドウが背面に隠れてしまう(前面に表示されてくれない)

単純なバッチファイルではちゃんと前面に出るのに、 new.bat みたいな煩雑なバッチファイルになるとなぜか出てこなくなる

なぜだろう?

対処方法はどうすればいいのだろう?(ちなみにバッチファイルだけで完結したいので win32api 使うとかはナシで)

※new.bat とは拙作 canvasp の同梱バッチファイル。画像ファイルを簡単に用意してくれるツールです。よかったら使ってみてね。

原因は何?

わからないです。

下記記事によると「親ウィンドウを認識していないから」とのことだが、いまいちピンと来ない。今回の new.bat は煩雑だが set と for /F "usebackq" を使っているだけであり、親ウィンドウどうこう的な処理は何もしてないと思っているのだが。

対処方法は?

start で開く部分の処理を別のバッチファイル opener.bat に移し、opener.bat を start する

Before: 背面に隠れていた時のソース

start "" "%PAINT_APP_PATH%" "%DATA_DIRNAME%\%filename%"

環境変数もりもりだが、要するに

start "" (mspaintのパス) (画像ファイル)

という書き方になっている。これが実行されると、なぜかペイントのウィンドウが背面に表示される。

After: 前面に表示されるソース

まず呼び出し元はこう。

call open_image.bat "%DATA_DIRNAME%\%filename%"

open_image.bat という 指定されたファイルをペイントで開くバッチファイル を start している。

で、open_image.bat は以下のとおり。

@echo off
setlocal
set PAINT_APP_PATH=mspaint.exe
start "" "%PAINT_APP_PATH%" %*

一般化すると……

Before:

start "" (mspaintのパス) (画像ファイル)

After:

rem 呼び出し元
start "" (指定ファイルをペイントで開くバッチファイル) (画像ファイル)
rem 指定ファイルをペイントで開くバッチファイル
start "" (mspaintのパス) %*

実際のソース

細かい解説はしないが、リンクだけ置いておく。

Before:

After:

なぜこれで前面に表示されるようになるか

ぶっちゃけわからん

ただ、以下はわかっていたので、

  • a) 単に start を書いただけのバッチファイル → 前面に出る
  • b) new.bat などなんか煩雑なバッチファイル → 前面に出ない(背面に隠れちゃう)

だったら start 使う部分だけ「start するだけのバッチファイル」として外に出せば、a) になるんじゃないか と考えて試してみたらビンゴだった、という話。