特定の場所でプログラムが実行されているかどうかを確認する方法を知りたいです。たとえば、test.exe には c:\loc1\test.exe と c:\loc2\test.exe の 2 つの場所があります。c:\loc1\test.exe が実行されているかどうかだけを知りたかったのですが、test.exe のすべてのインスタンスではありません。
8 に答える
bool isRunning = Process.GetProcessesByName("test")
.FirstOrDefault(p => p.MainModule.FileName.StartsWith(@"c:\loc1")) != default(Process);
これを試してください...私はそれを使用して、起動しようとしているexeと同じ名前で別のプロセスがすでに実行されているかどうかを判断し、それがすでに実行されている場合は、そのプロセスをフォアグラウンドに移動します(そしてフォーカスします)実行中...プロセス名を取得してその特定の名前をテストするように変更できます...これにより、特定の名前で実行されているプロセスがあるかどうかがわかりますが、そのプロセスがどこからロードされたかはわかりません...
指定された名前で実行中のプロセスがある場合、そのプロセスに、ロード元の場所を返すアクセス可能なメソッドが公開されている場合、実行中のプロセスでそのメソッドを呼び出すことができます。そうでない場合はわかりません..
しかし、ただの好奇心から、彼らが異なっていない限り、なぜあなたは気にしますか? そして、それらが何らかの形で異なる場合は、その違い (それが何であれ) を使用して、どちらがロードされているかを検出するコードを作成します。しかし、それらが同じである場合、それをロードするためにどのディスク上のイメージが使用されたかがどう問題になるのでしょうか?
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);
private const int SW_HIDE = 0;
private const int SW_SHOWNORMAL = 1;
private const int SW_SHOWMINIMIZED = 2;
private const int SW_SHOWMAXIMIZED = 3;
private const int SW_SHOWNOACTIVATE = 4;
private const int SW_RESTORE = 9;
private const int SW_SHOWDEFAULT = 10;
private static bool IsAlreadyRunning()
{
// get all processes by Current Process name
Process[] processes =
Process.GetProcessesByName(
Process.GetCurrentProcess().ProcessName);
// if there is more than one process...
if (processes.Length > 1)
{
// if other process id is OUR process ID...
// then the other process is at index 1
// otherwise other process is at index 0
int n = (processes[0].Id == Process.GetCurrentProcess().Id) ? 1 : 0;
// get the window handle
IntPtr hWnd = processes[n].MainWindowHandle;
// if iconic, we need to restore the window
if (IsIconic(hWnd)) ShowWindowAsync(hWnd, SW_RESTORE);
// Bring it to the foreground
SetForegroundWindow(hWnd);
return true;
}
return false;
}
既存のすべてのプロセスを繰り返し処理してから、それらのMainModuleプロパティで探しているファイル名を確認する必要があります。このようなもの
using System.Diagnostics;
using System.IO;
//...
string fileNameToFilter = Path.GetFullPath("c:\\loc1\\test.exe");
foreach (Process p in Process.GetProcesses())
{
string fileName = Path.GetFullPath(p.MainModule.FileName);
//cehck for equality (case insensitive)
if (string.Compare(fileNameToFilter, fileName, true) == 0)
{
//matching...
}
}
この関数は次の場合に役立ちます。
using System.Diagnostics;
public bool IsProcessOpen(string name)
{
foreach (Process clsProcess in Process.GetProcesses()) {
if (clsProcess.ProcessName.Contains(name))
{
return true;
}
}
return false;
}
プログラムが実行されているディレクトリ構造から名前が付けられた名前付きミューテックスを使用できます。
System.Reflection.Assembly.GetEntryAssembly()
これにより、次のようなエントリ アセンブリに関する多くの情報が得られます。
System.Reflection.Assembly.GetEntryAssembly().CodeBase;
これにより、実行中のアセンブリの場所がわかります。