日記:C#で外部アプリにより起動中のファイル名を取得しようとしたが、、、

こんにちは(`・ω・´)

絵を描くときに、参考画像をたくさん開くので、閉じてしまってもすぐに画面を復元できるように、
①ボタン一つで起動中の複数画像ファイルのウィンドウ位置とサイズとファイル名を保存し、
②ボタン一つで保存した複数画像ファイルを開き、指定のウィンドウ位置とサイズにする
C#デスクトップアプリを作ろうとしました。

 結局、Windowsフォトの場合にファイル名を取得がうまくいかず、無理やり取得するには時間がかかりそうだったので途中で今回はやめました。ウィンドウタイトルバーにファイル名が含まれている場合は、そこからファイル名を簡単に取得可能です。
 中途半端なので、日記として自分用のメモを残します( ˘•ω•˘ )

Win32 API

 Windowsオペレーションシステムの機能をWindowsが提供しているAPIで操作することができます。C#でもこのWindows APIを使うことでき、今回の目的関連で言うと、

・起動中のアプリの名前やパス、プロセスID、ウィンドウハンドル、メインウィンドウタイトルなど各種情報の取得}
・ウィンドウの移動、サイズ変更

などできます。

保存した複数画像ファイルを開く

System.Diagnostics.Process.Start(appliname, auguments)関数を使えば起動可能。例↓
System.Diagnostics.Process p = System.Diagnostics.Process.Start(appliname,” \”\” “+@” /c start ” + filename);


ウィンドウの移動、サイズ変更は下記MoveWindow関数で可能。例↓
//MoveWindow関数の宣言
[System.Runtime.InteropServices.DllImport(“user32.dll”)]
private static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth, int nHeight, int bRepaint);

MoveWindow(p.MainWindowHandle, 300, 200, 1000, 2000, 1); //left, top, width, height

起動中の複数画像ファイルの位置とファイル名を保存

System.Diagnostics.Process.GetProcesses()関数でプロセス取得後、
p.MainWindowHandleでウィンドウハンドルが見れる。(取得したプロセスをpとする)
そのウィンドウハンドルを用いて、GetWindowRect関数によりウィンドウ位置、サイズを取得できます。

同様にプロセス取得後、p.MainWindowTitleでタイトルバー名を取得できる。
タイトルバーにファイル名が含まれている場合は文字列処理をして、ファイル名を抽出可能です。

今回保存したかったWindowsアプリのタイトルバーは全て「フォト」という名前になってしまう仕様になってました( ˘•ω•˘)グモッ
調べたところ、起動中のアプリ名は簡単に得られますが、そのアプリで開いているファイル名とパスを得るのは、アプリごとに方法が変わってくるっぽいですね?

ハンドルとメッセージを使うことで、外部アプリをC#から更に細かく触れるようなので、それを使ったり、
UI automationを使えば開いているフォトのファイル名を取得できるかもという情報も見つめましたが、
どちらにせよ、アプリを作る時間がかかる割に、自分のPC環境専用のアプリになってしまいそうな感があったので、ここで今回は終了しました( ˘•ω•˘ )

勉強にはなったのでヨシっ!とします。

ではლ(๑^Δ^๑)

コメント

タイトルとURLをコピーしました