Windowsにおいて、プログラムから現在開いているエクスプローラーが開いているフォルダ一覧を取得する方法はありますか?言語は問いません。
Windows APIを使用して、現在開いているエクスプローラーのウィンドウが開いているフォルダ一覧を取得することができます。以下はC#でのサンプルコードです。
using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private const uint WM_USER = 0x400;
private const uint BFFM_SETSELECTIONW = WM_USER + 103;
static void Main(string[] args)
{
IntPtr hwnd = FindWindow("CabinetWClass", null);
if (hwnd != IntPtr.Zero)
{
SendMessage(hwnd, BFFM_SETSELECTIONW, IntPtr.Zero, Marshal.StringToHGlobalUni("")); // ルートフォルダを設定する
}
else
{
Console.WriteLine("エクスプローラーウィンドウが開かれていません");
}
}
}
このコードでは、FindWindow
関数を使用してCabinetWClass
クラス名のウィンドウを探し、SendMessage
関数を使用してBFFM_SETSELECTIONW
メッセージを送信し、フォルダを選択しています。このコードを実行すると、エクスプローラーウィンドウが開かれている場合は、そのウィンドウが開いているフォルダが選択されます。
同一の内容をWindows Script Hostを用いて実現する方法はありますか?
はい、Windows Script Host(WSH)を使用して、現在開いているエクスプローラーウィンドウが開いているフォルダ一覧を取得することができます。以下はVBScriptでのサンプルコードです。
Set shell = CreateObject("Shell.Application")
Set windows = shell.Windows
For Each window in windows
If InStr(1, window.FullName, "explorer.exe", vbTextCompare) > 0 Then
Set folder = window.Document.Folder
WScript.Echo folder.Path
End If
Next
このコードでは、Shell.Application
オブジェクトを使用して、現在開いているすべてのWindowsエクスプローラーウィンドウのコレクションを取得し、各ウィンドウのFullName
プロパティをチェックして、explorer.exe
が含まれているかどうかを確認しています。エクスプローラーウィンドウが見つかった場合は、そのウィンドウのDocument.Folder
プロパティを使用して、開かれているフォルダを取得し、WScript.Echo
でフォルダのパスを出力します。
このスクリプトを実行すると、現在開いているすべてのエクスプローラーウィンドウが開いているフォルダのパスが表示されます。
Windows上のNode.JSからShell.Applicationオブジェクトを使用することはできますか?