いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

特定のプロセスをアクティブにする-2(ShowWindow, SetForegroundWindow)

この前、http://d.hatena.ne.jp/gsf_zero1/20070509/p1 にてMicrosoft.VisualBasic.Interactionを
利用したサンプルを記述しましたが、前回のサンプルでは

アクティブにしたいプロセスが最小化状態になっている場合何故かアクティブに出来ない

という状態が私の環境では起こりました・・。


てことで、win-apiを直接コールして処理する方法もあるみたいなので
以下にサンプルを記述します。


利用するwin-apiは、

ShowWindow(int hWnd, int nCmdShow);
SetForegroundWindow(int hWnd);

の二つです。

以下サンプルです。

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace Gsf.Samples.CSharp {

    class EntryPoint{

        /////////////////////////////////////
        //
        // 利用するwin-apiの宣言.
        //
        // [参照URL]
        //      ■WinAPI Database for VB Programmer
        //      http://www.winapi-database.com/Window/Change/index.html
        //
        //      ■C#,VB.NET入門(二重起動をした時に既に起動中のアプリケーションをアクティブにする)
        //      http://jeanne.wankuma.com/tips/process/activewindow.html
        //
        //
        /// 
        /// 指定したウィンドウの表示状態を設定します。
        /// 
        /// ハンドル
        /// 表示状態
        /// 直前にウィンドウが表示されている場合, 0以外、そうでない場合は0
        [DllImport("user32.dll")]
        static extern int ShowWindow(IntPtr handle, int command);

        /// 
        /// 指定したウィンドウをzオーダーの最前面に移動させます。
        /// 
        /// ハンドル
        /// 正常:0以外, それ以外:0
        [DllImport("user32.dll")]
        static extern int SetForegroundWindow(IntPtr handle);

        /// 
        /// ShowWindow関数に使用するWindow状態値
        /// 
        /// 
        /// 値9は、windowの状態を復元することを意味します。
        /// 
        const int SW_RESTORE = 9;

        /// 
        /// アクティブにするプロセス名
        /// 
        const string APP_NAME = "AFX";

        /// 
        /// アプリケーションメインエントリポイントメソッドです。
        /// 
        /// 
        /// 既に起動している特定のプロセスをアクティブにします。
        /// 
        /// ・定数APP_NAMEにアクティブにしたいプロセス名をセットして実行してください。
        /// ・アクティブにするプロセスが起動していないと何も起こりません。
        /// 
        static void Main(){

            foreach(Process aProcess in Process.GetProcessesByName(APP_NAME)){

                IntPtr handle = aProcess.MainWindowHandle;

                //
                // ウィンドウの表示状態を復元
                //
                ShowWindow(handle, SW_RESTORE);
                //
                // 最前面にウィンドウを移動
                //
                SetForegroundWindow(handle);
            }
        }
    }
}