C#二重起動をした時に既に起動中のアプリケーションをアクティブにする

スポンサーリンク

二重起動 (多重起動) を防止するついでに、既に起動中だったプログラムのメインウィンドウをアクティブにします。残念ながら .NET Framework では、他のプログラムのウィンドウを操作することはできません。Win32API に頼らざるを得ないので、お勧めはできません。(Microsoft.VisualBasic.AppActicate メソッドを使う方法もありますが、アンマネージドです)

ここでは、既に起動中のプログラムのメインウィンドウをアクティブにし true を返す関数を紹介します。起動中でなければ、false を返しますので、エントリポイントで合わせて使うことができます。

サンプルコード

以下にサンプルコードを示します。

C# 全般
// 以下の名前空間をインポートする
using System.Diagnostics;
using System.Runtime.InteropServices;

public class MyProcess {

    [DllImport("USER32.DLL", CharSet=CharSet.Auto)]
    private static extern int ShowWindow(
        System.IntPtr hWnd,
        int nCmdShow
    );

    [DllImport("USER32.DLL", CharSet=CharSet.Auto)]
    private static extern bool SetForegroundWindow(
        System.IntPtr hWnd
    );

    private const int SW_NORMAL = 1;

    /// ------------------------------------------------------------------------------------
    /// <summary>
    ///     同名のプロセスが起動中の場合、メイン ウィンドウをアクティブにします。</summary>
    /// <returns>
    ///     既に起動中であれば true。それ以外は false。</returns>
    /// ------------------------------------------------------------------------------------
    public static bool ShowPrevProcess() {
        Process hThisProcess = Process.GetCurrentProcess();
        Process[] hProcesses = Process.GetProcessesByName(hThisProcess.ProcessName);
        int iThisProcessId   = hThisProcess.Id;

        foreach (Process hProcess in hProcesses) {
            if (hProcess.Id != iThisProcessId) {
                ShowWindow(hProcess.MainWindowHandle, SW_NORMAL);
                SetForegroundWindow(hProcess.MainWindowHandle);
                return true;
            }
        }

        return false;
    }
}

使用例は以下のようになります。

C# 全般
[System.STAThread()]
private static void Main() {
    // 同名のプロセスが起動していない時は起動する
    if (! MyProcess.ShowPrevProcess()) {
        Application.Run(new Form1());
    }
}

関連するリファレンス

準備中です。

スポンサーリンク