0

したがって、プログラムの最初に、このプロセスの別のインスタンスが実行されているかどうかを確認するコードがあります。

Process process = Process.GetCurrentProcess();
bool isProcessRunning = (Process.GetProcessesByName(process.ProcessName)).Length > 1;

プロセスが実行中の場合は、プロセスが既に実行されていることを示すメッセージ ボックスを開き、現在のプロセスを終了して新しいプロセスを開くかどうかをユーザーに尋ねます。

ダイアログの結果が「はい」の場合、process.kill を使用してプロセスを閉じます。問題は、これらのプロセスのうち 2 つを実行することです。どちらを閉じるかを指定するにはどうすればよいでしょうか。プロセス名が全く同じになるので、先に開いたものを閉じたい。

4

6 に答える 6

3
private static void killps(string processName)
{
    Process[] process = Process.GetProcessesByName(processName);
    Process current = Process.GetCurrentProcess();
    foreach (Process p in process)
    {
        if (p.Id != current.Id)
        p.Kill();
    }
}
于 2012-11-15T15:18:01.770 に答える
1

同じ名前のプロセスをループして、ID が異なるかどうかを確認します。もしそうなら、それを殺します。

Process process = Process.GetCurrentProcess();
var dupl = (Process.GetProcessesByName(process.ProcessName));
if( dupl.Length > 1 && MessageBox.Show("Kill?", "Kill duplicates?", MessageBoxButtons.YesNo) == DialogResult.Yes ) {
    foreach( var p in dupl ) {
        if( p.Id != process.Id )
            p.Kill();
    }
}
于 2012-11-15T15:10:33.800 に答える
0

少し前に、このサイトの別の質問と回答からいくつかの R&D (Ripoff and Deploy) を使用してこれを書きました (オリジナルは見つかりません)。プログラムが既に同じパスから実行されているかどうかを確認します (これにより、複数のパスが許可されます)。インスタンスは、exe が別のパスから起動されている限り)。他のプログラムをアクティブ ウィンドウにし (最小化されていた場合はウィンドウを復元します)、重複したインスタンスが開かれていることをユーザーに通知することさえありません。

public static class SingleApplication
{
    [DllImport("user32.Dll")]
    private static extern int EnumWindows(EnumWinCallBack callBackFunc, int lParam);

    [DllImport("User32.Dll")]
    private static extern void GetWindowText(int hWnd, StringBuilder str, int nMaxCount);

    [DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow);

    static Mutex mutex;
    const int SW_RESTORE = 9;
    static string sTitle;
    static IntPtr windowHandle;
    delegate bool EnumWinCallBack(int hwnd, int lParam);

    private static bool EnumWindowCallBack(int hwnd, int lParam)
    {
        windowHandle = (IntPtr)hwnd;
        StringBuilder sbuilder = new StringBuilder(256);
        GetWindowText((int)windowHandle, sbuilder, sbuilder.Capacity);
        string strTitle = sbuilder.ToString();
        if (strTitle == sTitle && hwnd != lParam)
        {
            ShowWindow(windowHandle, SW_RESTORE);
            SetForegroundWindow(windowHandle);
            return false;
        }
        return true;
    }

    /// <summary>
    /// Execute a form application. If another instance already running on the system activate previous one.
    /// </summary>
    /// <param name="frmMain">main form</param>
    /// <returns>true if no previous instance is running</returns>
    public static bool Run(System.Windows.Forms.Form frmMain)
    {
        if (IsAlreadyRunning())
        {
            sTitle = frmMain.Text;
            EnumWindows(new EnumWinCallBack(EnumWindowCallBack), frmMain.Handle.ToInt32());
            return false;
        }
        Application.Run(frmMain);
        return true;
    }

    /// <summary>
    /// Checks using a Mutex with the name of the running assembly's location
    /// </summary>
    /// <returns>True if the assembly is already launched from the same location, false otherwise.</returns>
    private static bool IsAlreadyRunning()
    {
        string strLoc = Assembly.GetEntryAssembly().Location;

        FileSystemInfo fileInfo = new FileInfo(strLoc);
        string name = fileInfo.Name;
        mutex = new Mutex(true, name);
        if (mutex.WaitOne(0, false))
        {
            return false;
        }
        return true;
    }
}

次のように使用されます

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        SingleApplication.Run(new Form1());
    }
}

必要に応じて、trueまたはfalseそれが返されたかどうかSingleApplication.Run()を確認して、プログラムが起動しているかどうかを確認できます。通常終了して true を返すまでブロックするApplication.Run()か、プログラムが既に実行されている場合はすぐに false を返します。

于 2012-11-15T15:44:08.557 に答える
0

Process.StartTime プロパティを使用して、後で開始されるプロセスを確認し、それを強制終了できます。

于 2012-11-15T15:18:24.743 に答える
0

両方のプロセスの開始時間を比較します。

 Process process = Process.GetCurrentProcess();
 Process [] duplicateProcess = Process.GetProcessesByName(process.ProcessName).ToArray();
 if (duplicateProcess.Length > 1)
 { 
        if (MessageBox.Show("Duplicate Found. Do you want to kill duplicate process", "Duplicate Process", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        {
            foreach (Process p in duplicateProcess)
            {
                int res = DateTime.Compare(p.StartTime, process.StartTime);
                if (res < 0)
                {
                    // P process opened first
                    p.Kill();
                }
                else if ( res > 0 )
                {
                    // process Opened first
                    process.Kill();
                }
            }
        }
    }
于 2012-11-15T15:45:53.327 に答える
0

これを使用して、現在開始中のプロセスを強制終了します。カウントはプログラム パスの場所に基づいて 2 になり、終了します。

if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) System.Diagnostics.Process.GetCurrentProcess().Kill();

次のものも使用できます。

Process.Id

GetProcessesByName を使用して現在のプロセスを取得した後、異なるプロセスを実行します。

于 2012-11-15T15:10:14.673 に答える