C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: Process起動時のフォーカス移動について


(過去ログ 77 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■45281 / inTopicNo.1)  Process起動時のフォーカス移動について
  
□投稿者/ NU (1回)-(2010/01/08(Fri) 03:27:02)

分類:[.NET 全般] 

はじめまして。
現在、下記のようにループ内で外部実行ファイルに対応したProcessの作成、起動を行うプログラムを書いています。外部実行ファイルは、処理完了後に自動で終了します。
開発環境、使用言語は VB2008 Express Edition です。

For i as Integer = 0 to 10
Dim hoge as new Process()
hoge.StartInfo.FileName = name
hoge.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
hoge.Start()
hoge.WaitForExit()
hoge.Close()
hoge.Dispose()
Next

ここからが質問です。
フォーカスが外部実行ファイル起動時にそちらに移り、終了後に現在のウィンドウに戻ってくる、という動作をしてしまうのですが、これを回避する方法はありますでしょうか?
ループで処理しているため、例えばテキスト入力中にフォーカスを失い文の途中が抜ける、といったような弊害があります。
.NETの問題というよりは、Windowsの仕様の問題のような気もするのですが、何か回避手段があるならばお教えください。

よろしくお願いします。
引用返信 編集キー/
■45304 / inTopicNo.2)  Re[1]: Process起動時のフォーカス移動について
□投稿者/ オショウ (498回)-(2010/01/09(Sat) 12:13:45)
No45281 (NU さん) に返信
> ここからが質問です。
> フォーカスが外部実行ファイル起動時にそちらに移り、終了後に現在のウィンドウに戻ってくる、という動作をしてしまうのですが、これを回避する方法はありますでしょうか?
> ループで処理しているため、例えばテキスト入力中にフォーカスを失い文の途中が抜ける、といったような弊害があります。
> .NETの問題というよりは、Windowsの仕様の問題のような気もするのですが、何か回避手段があるならばお教えください。

  その起動するアプリにはウィンドウが不必要なのであれば、
  Windowsフォームアプリで作っても、フォームを全て削除し
  モジュールのSub Mainで起動するようにして、そこで機能
  を処理するようにすれば、フォーカス移動はしませんが。

  簡単な対処かと思います。

以上。参考まで
引用返信 編集キー/
■45306 / inTopicNo.3)  Re[2]: Process起動時のフォーカス移動について
□投稿者/ Azulean (497回)-(2010/01/09(Sat) 13:40:38)
対象のプロセスはどういったアプリケーションですか。
ウィンドウがあるアプリなのか、コマンドプロンプトが出てくるアプリなのか、そのあたりはどうでしょうか。
対象のアプリケーションの作り次第では、呼び出し側では何も手を打てない可能性はあります。
(別セッションとして実行すれば良いかもしれませんが)

No45304 (オショウ さん) に返信
>   その起動するアプリにはウィンドウが不必要なのであれば、
>   Windowsフォームアプリで作っても、フォームを全て削除し
>   モジュールのSub Mainで起動するようにして、そこで機能
>   を処理するようにすれば、フォーカス移動はしませんが。
それができるということは、そもそも別プロセスにする必要性がないのでは。
起動した直後に Process.WaitForExit を呼ぶのであれば、自分のプロジェクトにソースコードを取り込んだ方が楽でしょう。
引用返信 編集キー/
■45320 / inTopicNo.4)  Re[3]: Process起動時のフォーカス移動について
□投稿者/ NU (2回)-(2010/01/10(Sun) 02:10:15)
オショウ さん、Azulean さん、返信ありがとうございます。

No45304 (オショウ さん) に返信
掲載したコードは今回質問したかったプロセス実行部分のコード例であり、実際は自作フォームで各種設定を入力後、BackgroundWorkerにて外部実行ファイルを起動しています。
その処理中に他の作業を行いたいのですが、外部実行ファイルが起動するたびにフォーカスが移動してしまうので何か解決策が無いかお聞きした次第です。
説明不足で申し訳ありません。

No45306 (Azulean さん) に返信
> 対象のプロセスはどういったアプリケーションですか。
> ウィンドウがあるアプリなのか、コマンドプロンプトが出てくるアプリなのか、そのあたりはどうでしょうか。
対象アプリケーションはウィンドウを持っており、起動時引数としてこちらが設定したものを読み込んで処理、完了後に終了します。

>(別セッションとして実行すれば良いかもしれませんが)
セッションがよく分からないのですが、スレッドという認識でよろしいのでしょうか?

>起動した直後に Process.WaitForExit を呼ぶのであれば、自分のプロジェクトにソースコードを取り込んだ方が楽でしょう。
対象アプリケーションは自作でないため、実行ファイルのみ手許にあります。

長くなりましたが、引き続きよろしくお願いいたしますm(_ _)m
引用返信 編集キー/
■45321 / inTopicNo.5)  Re[4]: Process起動時のフォーカス移動について
□投稿者/ オショウ (499回)-(2010/01/10(Sun) 02:53:41)
No45320 (NU さん) に返信
> 説明不足で申し訳ありません。

  最初からそう書いてくれてれば・・・

> 対象アプリケーションは自作でないため、実行ファイルのみ手許にあります。

  であれば・・・
  http://dobon.net/vb/dotnet/process/movewindow.html

  ここのがサンプルになると思いますが、起動したプロセスのウィンドウの
  Zオーダーを最下位に変更し、後に自身をトップレベルウィンドウにすれ
  ば、フォーカスは戻ってくると思います。

  が、一瞬でもフォーカスが外れるので、100%ではありません。

  理由は、起動したアプリ側でウィンドウを生成する際、こちらでそのプロ
  セスの起動設定でウィンドウの位置等細工しても100%反映できないからで
  す。起動するアプリが勝手にいろいろやっていると、どうにもならない。

  ましてウィンドウが生成されないと、Zオーダーも変更できないし・・・

※ 最良な方法は、その起動したいアプリの方も改良することでしょう。

以上。参考まで
引用返信 編集キー/
■45322 / inTopicNo.6)  Re[4]: Process起動時のフォーカス移動について
□投稿者/ Azulean (498回)-(2010/01/10(Sun) 03:00:10)
> その処理中に他の作業を行いたいのですが、外部実行ファイルが起動するたびにフォーカスが移動してしまうので何か解決策が無いかお聞きした次第です。

Process クラスではできなさそうですが、ShellExecute/ShellExecuteEx で SW_SHOWNOACTIVATE を指定して効果があるかどうか。

なお、先ほども書きましたが、そのアプリケーションの作り次第です。
コマンドライン引数や ProcessStartInfo.WindowStyle、ShellExecute の nShow などで制御できなければ、基本的に無理じゃないでしょうか。
(標準・最小化・最大化をパラメータとして指定できたとしても、それを無視するアプリケーションも作れるため)

> >(別セッションとして実行すれば良いかもしれませんが)
> セッションがよく分からないのですが、スレッドという認識でよろしいのでしょうか?
いいえ、スレッドではありません。

--- 以下のセッションに関する説明は間違っている可能性がありますのでご自身でお調べください ---
ユーザ切り替えの仕組みを思い浮かべて頂けると分かりやすいかもしれませんが、あれはセッションを切り替えているイメージのハズです。
--------------------------------------------

ただ、別セッションで実行するというアプローチ自体、あまり現実的ではなさそうな気がしてきました。
(試したことはありませんので実現可否を含めて自信がないかも)
引用返信 編集キー/
■45414 / inTopicNo.7)  Re[4]: Process起動時のフォーカス移動について
□投稿者/ kaishu (2回)-(2010/01/12(Tue) 16:30:49)
No45320 (NU さん) に返信

 BackgroundWorkerにて外部実行ファイルを起動しているほうのコードで
 BackgroundWorkerを起動後にフォーカスを取得するコードを追加してみ
 てはいかがでしょうか。

  '' BackgroundWorkerにて外部実行ファイルを起動
  BackgroundWorker.RunWorkerAsync()

  '' フォーカスを取得
  Me.Focus()
引用返信 編集キー/
■45415 / inTopicNo.8)  Re[5]: Process起動時のフォーカス移動について
□投稿者/ KR (1回)-(2010/01/12(Tue) 16:50:21)
hoge.StartInfo.WindowStyleをMinimizedにしても、同じでしょうか?
引用返信 編集キー/
■45434 / inTopicNo.9)  Re[6]: Process起動時のフォーカス移動について
□投稿者/ kaishu (3回)-(2010/01/13(Wed) 01:48:25)
No45415 (KR さん) に返信

> hoge.StartInfo.WindowStyleをMinimizedにしても、同じでしょうか?

 質問の主の NUさん の状況をまねして試してみますと、
 Minimized の場合にはタスクバーにバックグラウンド起動したプログラム
 表示され、Hiddenの場合にはタスク バーに表示されないといった違いは
 ありますが、起動元の画面がロスト フォーカスしてしまう事象はいずれの
 場合も発生してしまいます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -