【C#】現在アクティブなウィンドウ(エクスプローラ)の開いているフォルダのフルパスを取得したい
Q&A
解決したいこと
現在アクティブなウィンドウ(エクスプローラ)の開いているフォルダのフルパスを取得したいです。
下記のサイトを参考に現在アクティブなウィンドウの”フォルダ名”だけ取得できました。
https://teratail.com/questions/55002
デバックで変数の中身確認すると、
「process.MainModule.FileName」にフルパス情報がありましたので
取得しようとしたとき、
デバック実行と、exe実行で結果が異なりました。。
デバック実行すると問題なく、
フルパスを取得することができ、メッセージダイアログにも
フルパスが表示されます。
ただ、exe(bin\Debugフォルダ内に作成されるexe)を直接実行すると、
何も変化がありません。
(WindowsFormで作成していますが、WindowsForm画面もメッセージダイアログも何も表示されません。)
exe実行した時にもフルパスが取得できるようにするには
どのようにすれば良いでしょうか。
ご教示お願いします。
実際のコード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
/// Win32API の extern 宣言クラス
public static class WinAPI
{
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
GetActiveWindow();
}
private void GetActiveWindow()
{
IntPtr handle = WinAPI.GetForegroundWindow();
int id;
WinAPI.GetWindowThreadProcessId(handle, out id);
Process process = Process.GetProcessById(id);
if (process.ProcessName == "explorer")
{
var Title = process.ProcessName + " " + process.MainWindowTitle;
Title = process.MainModule.FileName; //フルパス取得//この行をコメントアウトするとexe実行してもダイアログが表示されます
MessageBox.Show(Title);
}
else
{
var tTitle = "[not explorer]" + process.ProcessName;
tTitle = process.MainModule.FileName;//フルパス取得//この行をコメントアウトするとexe実行してもダイアログが表示されます
MessageBox.Show(tTitle);
}
}
}
}
”フルパス取得”のコードをコメントアウトしたexeを
実行した時のダイアログ画像
”フルパス取得”のコードを復活させるとダイアログが表示されない。
(WindowsFormも表示されない。。。)