Excel 起動コマンドを作成(Visual C# ソース公開)

何のため?
って思いますよね。
いつも沢山のExcelファイルを開いていて、既に開いているファイルを新たに開こうとしたり、最初からリードオンリーで簡単に開きたいと思ったからです。

1. 既に開いているファイルを開こうとした時、それをタスクから探して最前面にアクティブ化します。

2. Ctrl キーを押しながら開けば、リードオンリーで開きます。

3. Alt キーを押しながら開けば、別のプロセスで Excel を実行して開きます(別プロセスなので既に開いているファイルをいくつでも開けます)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace ReadonlyExcel
{
    public partial class Form1 : Form
    {
        [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_RESTORE = 9; // 画面を元の大きさに戻す

        private string path;
        private bool noReadonly = false;
        private bool newProcess = false;

        public Form1(string[] args)
        {
            InitializeComponent();
            try
            {
                this.path = args[0];
                noReadonly = ((Control.ModifierKeys & Keys.Control) == Keys.Control);
                newProcess = ((Control.ModifierKeys & Keys.Alt) == Keys.Alt);
            }
            catch{}
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            bool much = false;
            if (!newProcess) {
                try
                {
                    ManagementPath p = new ManagementPath("Win32_Process");
                    ManagementClass mc = new ManagementClass(p);
                    EnumerationOptions opt = new EnumerationOptions();
                    opt.EnumerateDeep = true;
                    ManagementObjectCollection moc = mc.GetInstances(opt);
                    //ManagementObjectCollection moc = mc.GetInstances();

                    foreach (ManagementObject obj in moc)
                    {
                        object commandLineObj = obj["CommandLine"];
                        if ((commandLineObj != null) && (obj["Caption"].ToString().ToUpper() == "EXCEL.EXE"))
                        {
                            string commandLine = commandLineObj.ToString();
                            if (commandLine.ToUpper().IndexOf(this.path.ToUpper()) != -1)
                            {
                                foreach (Process pr in Process.GetProcesses())
                                {
                                    if (pr.MainWindowHandle != IntPtr.Zero)
                                    {
                                        if (pr.Id == (uint)obj["ProcessId"])
                                        {
                                            if (IsIconic(pr.MainWindowHandle))
                                            {
                                                ShowWindowAsync(pr.MainWindowHandle, SW_RESTORE);
                                            }
                                            SetForegroundWindow(pr.MainWindowHandle);
                                            much = true;
                                            break;
                                        }
                                    }
                                }
                                if (much)
                                    break;
                            }
                        }
                    }
                }
                catch
                {
                }
            }

            if(much){
                this.Close();
            }else{
                try
                {      
                    ProcessStartInfo hPsInfo = new System.Diagnostics.ProcessStartInfo();
                    // 起動するEXCEL.EXEを設定
                    hPsInfo.FileName = @"C:\Program Files\Microsoft Office\office14\Excel.exe";
                    // コマンドライン
                    hPsInfo.Arguments = string.Empty;
                    if (newProc}
                    {
                        hPsInfo.Arguments = @" /x ";
                    }
                    if (!this.noReadonly)
                    {
                        hPsInfo.Arguments += @" /r ";
                    }
                    hPsInfo.Arguments += "\"" + this.path + "\"";
                    // 新しいウィンドウを作成するかどうかを設定する(初期値false)
                    hPsInfo.CreateNoWindow = false;
                    // シェルを使用するかどうか設定する(初期値true)
                    hPsInfo.UseShellExecute = false;
                    // 起動できなかった時にエラーダイアログを表示するかどうかを設定する(初期値false)
                    hPsInfo.ErrorDialog = true;
                    // アプリケーションを起動する時の動詞を設定する
                    hPsInfo.Verb = "Open";
                    // 起動ディレクトリを設定する
                    hPsInfo.WorkingDirectory = Path.GetDirectoryName(this.path);
                    // 起動時のウィンドウの状態を設定する
                    hPsInfo.WindowStyle = ProcessWindowStyle.Minimized; //最小化
                    // ProcessStartInfoを指定して起動する
                    Process.Start(hPsInfo);
                }
                finally
                {
                    this.Close();
                }
            }
        }
    }
}

コメント