投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/10/31 20:13:01
> 実行中に表示した画像をあるタイミングで閉じたいと思っております。
残念ながら、汎用的な方法は無いと思います。
関連付け起動によってアプリを開くことができたとしても、
それをどうやって閉じるか、その手段は統一的ではありません。

たとえば、異なる複数の画像を同時に開こうとした場合、
「起動されるごとに新しいウィンドウで開かれる」アプリもあれば、
「すでにアプリが開かれていれば、同じウィンドウ内で別の画像を開きなおす」アプリもあるし、
「複数の画像を開いた場合も、すべて同一ウィンドウ内の別々のタブで開く」アプリもあります。

こうなると、メインウィンドウを閉じればよい…という単純な話にはならず、
CloseMainWindow メソッドが使える保証がありません。
そもそも今回のように、Process インスタンスを取得できないケースも珍しくないですし。

起動されるアプリケーションが固定的であるならば、現在開かれているウィンドウを列挙し、
その中で該当ウィンドウを探し当てて、目的の画像のみ閉じるようなコードを書くことは
できるかもしれませんが、アプリケーションごとに固有の操作になってしまうので、
汎用的な仕組みにするのは難しいでしょう。
相手がストア アプリ URI ランチャー アプリケーションの場合は特に。


> 「Nothing」が返ってきます。
「別のプロセスを起動して、直ちに終了してしまうプロセス」が呼び出された場合などは、
対象インスタンスが既に存在しないため、Process クラスで捉えられません。

'標準アプリ(フォト)で画像が開かれる 
Run_Process = System.Diagnostics.Process.Start(Filename)

'Nothing 
MsgBox(Run_Process?.HasExited)


'Windows Photo Viewer で画像が開かれる 
Run_Process = System.Diagnostics.Process.Start("rundll32.exe", $"""{Environment.GetEnvironmentVariable("ProgramFiles")}\Windows Photo Viewer\PhotoViewer.dll"",ImageView_Fullscreen {Filename}")
'False 
MsgBox(Run_Process?.HasExited)


'フォトで画像が開かれる 
Run_Process = New System.Diagnostics.Process()
'Run_Process.StartInfo.FileName = "shell:AppsFolder\Microsoft.Windows.Photos_8wekyb3d8bbwe!App" 
Run_Process.StartInfo.FileName = "ms-photos:"
Run_Process.StartInfo.Arguments = Filename
Run_Process.StartInfo.UseShellExecute = True
Run_Process.Start()

'InvalidOperationException:このオブジェクトに関連付けられているプロセスはありません。 
MsgBox(Run_Process.HasExited)


関連付け起動で(ストアアプリの)「フォト」が呼ばれた場合、
画像を表示しているのは PhotosApp.exe ですが、
同時に PhotoService.exe も起動されているようですね。

環境によっては、"ms-photos:viewer?fileName=C:\ABC.jpg&fullScreen=1" のように
呼び出せたという情報もあるのですが、現行バージョンではこのパラメーターが無視される模様。
https://learn.microsoft.com/ja-jp/windows/uwp/launch-resume/launch-default-app#photos-app-uri-scheme
https://github.com/MicrosoftDocs/windows-dev-docs/issues/2500