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();
}
}
}
}
}
コメント