3

現在のプロセスのファイル名を取得しようとしています。

つまり、「test.txt」というファイルをメモ帳で開いている場合、「c:\folder\test.txt」のようなものを取得する必要があります。

以下のコードは、ソフトウェア パスを含むプロセス情報を返します。(例: "c:\windows\system32\notepad.exe")。

[DllImport("user32.dll", EntryPoint = "GetForegroundWindow", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int GetForegroundWindow();

[...]

public static string GetFilePathName()
{
    uint procId = 0;
    int hWnd = GetForegroundWindow();
    GetWindowThreadProcessId(hWnd, out procId);
    var proc = Process.GetProcessById((int)procId);
}

このプロセス クラスを使用して、現在のプロセスが処理している開いているファイル名/パスを取得することは可能ですか?

4

2 に答える 2

1

C# では、次の解決策があります。Kill() を呼び出すために Notepad.exe で開いているファイルを識別するためにこれを書きました。

解決策はウィンドウのタイトルによって異なります。この場合、メモ帳の書式設定は「無題 - メモ帳」、「config.ini - メモ帳」、「readme.txt - メモ帳」などになると予想できます。 char '-' を削除し、空白を削除します。

public static void getFileNameByProcess(string process)
{
    foreach (Process p in Process.GetProcessesByName(process))
    {
        string[] split = p.MainWindowTitle.Split('-');
        if (split.Length > 0)
            Console.WriteLine("\"" + split[0].Trim() + "\"");
    }
}

次のように使用します。getFileNameByProcess("Notepad");

ファイル名の例:

  1. 「config.ini」
  2. 「readme.txt」
  3. 「無題」

これらのファイル名を使用して、ディレクトリがどこにあるかの一般的な考えがあれば、ディレクトリを再帰的に検索できますが、そのような高価な呼び出しには注意してください

于 2016-06-23T20:31:04.087 に答える
0

可能かもしれませんが、相互運用機能を実際に調べて、メモ帳で開いている特定のファイルを見つける必要があります。

非常に強力な System.Diagnostics.Process クラスを使用して、.NET から多くの一般的なプロセス情報を取得できます。

https://msdn.microsoft.com/en-us/library/z3w4xdc9%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

たとえば、マシンで実行されているすべてのメモ帳プロセスを取得します。

Process[] notepads = Process.GetProcessesByName("notepad");

これを行うライブラリも入手できる場合があります。

C#でプロセスごとに開いているファイルハンドルのリストを取得するにはどうすればよいですか?

于 2015-05-07T23:09:00.383 に答える