質問
私C#のサポートするニーズを始め、外部のエグゼ時ませんが、ご希望の開始を別のプロセスが実行されてもスイッチです。
どのようにしてクライアントまで、フルのC#ういうこの例ではどれですか。
using System.Diagnostics;
...
Process foo = new Process();
foo.StartInfo.FileName = @"C:\bar\foo.exe";
foo.StartInfo.Arguments = "Username Password";
bool isRunning = //TODO: Check to see if process foo.exe is already running
if (isRunning)
{
//TODO: Switch to foo.exe process
}
else
{
foo.Start();
}
解決
このなすべきです。
//Namespaces we need to use
using System.Diagnostics;
public bool IsProcessOpen(string name)
{
//here we're going to get a list of all running processes on
//the computer
foreach (Process clsProcess in Process.GetProcesses()) {
//now we're going to see if any of the running processes
//match the currently running processes. Be sure to not
//add the .exe to the name you provide, i.e: NOTEPAD,
//not NOTEPAD.EXE or false is always returned even if
//notepad is running.
//Remember, if you have the process running more than once,
//say IE open 4 times the loop thr way it is now will close all 4,
//if you want it to just close the first one it finds
//then add a return; after the Kill
if (clsProcess.ProcessName.Contains(name))
{
//if the process is found to be running then we
//return a true
return true;
}
}
//otherwise we return a false
return false;
}
他のヒント
利用できるLINQ、
var processExists = Process.GetProcesses().Any(p => p.ProcessName.Contains("<your process name>"));
また、AppActivate機能VB runtimeを起動する既存のプロセス。また輸入しまいました。の構築が可能dllのC#プロジェクト.
using System;
using System.Diagnostics;
using Microsoft.VisualBasic;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Process[] proc = Process.GetProcessesByName("notepad");
Interaction.AppActivate(proc[0].MainWindowTitle);
}
}
}
できるだけで列挙プロセスを使用 ます。GetProcesses 方法。
していることが分かったミューテックスがうまくいきませんのようにコンソールに願います。そこで、WMIをクエリするプロセスのものがあることが知られているタスクマネージャー]ウィンドウするお問題です。
のものを使っておけば間違いないようになります:
static bool isStillRunning() {
string processName = Process.GetCurrentProcess().MainModule.ModuleName;
ManagementObjectSearcher mos = new ManagementObjectSearcher();
mos.Query.QueryString = @"SELECT * FROM Win32_Process WHERE Name = '" + processName + @"'";
if (mos.Get().Count > 1)
{
return true;
}
else
return false;
}
注意:追加議参照できます。管理"のタイプを行頭に付けた.
私の答えは問題を理解しどのようなときに申請が判断しのインスタンスfoo.exe が実行されていeん'//TODO:スイッチfoo.exe プロセス"であるとは何を意味するのか。
に過去のプロジェクトIを予防するには複数の実行の過程では、もちろん、一部のコードのinit部は、このプロセスを作成する名前のミューテックス.このmutextた、取得し続ける前にはすでに使用されています。場合には工程で作成可能なミューテックスで取得でメディアセンターが初めてであります。この場合プロセス制御のミューテックス、そして、失敗したのはこれが最初ではありませんので口すぐ。
っている第二のインスタンスからの走行により、依存関係の特定のハードウェアインタフェースによって必要なものとする"スイッチ"のラインナップは、あなたが必要な場合、あるいは具体的な解などのプロセスid。
また、私はソースコードへのアクセスの過程まったのが始まります。できない場合は具体的な方法を以下に示す、ミューテックスは明らかでないオプションです。
二つの懸念の注意:
自例関係を パスワードのコマンドライン。その cleartextを表現した秘密 がするのはセキュリティ情報漏えいの脆弱性があります。
が列挙プロセスをお願い 自分で処理に時間がかかる場合や処理まで いenumerate.すべてのユーザー、または 現在のユーザー?させてもらうことにな 現在のユーザーがログイン(二 デスクトップ)?
Mnebuerquo書き:
また、私はソースコードへのアクセス 工程かったのが始まります。の場合 の変更が行えない状態になり、コードの追加 ミューテックスは明らかでないオプションです。
思っていたソースコードへのアクセスの過程でいます。
っての工程MainWindowHandle切り替えは一度なんでalread:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetForegroundWindow(IntPtr hWnd);