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

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

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

Process.CloseMainWindow について

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

■87852 / inTopicNo.1)  Process.CloseMainWindow について
  
□投稿者/ TT (1回)-(2018/07/06(Fri) 17:05:50)

分類:[C#] 

環境はVS2017 .NET 4.7.2 になります。

Process.CloseMainWindow() にてC#の「Windows フォーム アプリケーション」を
終了させようと思ったのですが、メインウインドウよりサブウインドウが前面に
あるとそのサブウインドウのみ閉じられアプリケーションは終了しませんでした。

目的はアプリケーションの終了なのですが、Process.CloseMainWindow() は
メインウインドウを閉じるメソッドではないのでしょうか?

なお、Firefox でパージョン情報のウインドを前面に出してこちらを対象とした
場合、メインウインドウとバージョン情報の両方が閉じ、正しく終了することが
できました。

C#の「Windows フォーム アプリケーション」を Process.Kill() ではなく正常
終了させる場合、終了するまで Process.CloseMainWindow() を繰り返すなどの
工夫が必要なのでしょうか?
引用返信 編集キー/
■87853 / inTopicNo.2)  Re[1]: Process.CloseMainWindow について
□投稿者/ Hongliang (659回)-(2018/07/06(Fri) 17:39:11)
> 目的はアプリケーションの終了なのですが、Process.CloseMainWindow() は
> メインウインドウを閉じるメソッドではないのでしょうか?
Windowsのウィンドウの仕組みにおいては、「メインウィンドウ」というものは特に定義があるわけではありません。
Process::CloseMainWindow()は、「メインウィンドウ」を「表示されていてかつオーナーが存在しないウィンドウ」と定義しているようです。
WinFormであれば、FormのOwnerを設定したりShowの引数に与えてやれば、そのFormはメインウィンドウ扱いされなくなりますね。
参考:
https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/ProcessManager.cs,53d47c883d8b918a

そもそも、プロセスは必ずしもウィンドウを持っているわけではありませんし、全てのウィンドウを閉じたからと言ってプロセスが終了するかどうかもそのアプリケーションの作り次第です。
そして「正常終了」の定義もアプリケーション次第。
なのでアプリケーションによってどう終了させるのが正しいのかは異なります。

という前提の上で、普通に作ったWinFormアプリであり、最初に表示されたFormを閉じれば特に終了確認などもなくアプリケーションが終了する、というものであれば、
> 終了するまで Process.CloseMainWindow() を繰り返す
でいいんじゃないでしょうか。
引用返信 編集キー/
■87854 / inTopicNo.3)  Re[2]: Process.CloseMainWindow について
□投稿者/ TT (2回)-(2018/07/06(Fri) 18:58:34)
Hongliang様

ご回答ありがとうございます。メインウインドウ=メッセージループの対象と
思い込んでいました。
「表示されていてかつオーナーが存在しないウィンドウ」なのですね。
確かにサブフォームに Owner を設定すると対象外となりました。
この方法で対応しようと思います。

非常に質の高いご回答をありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ