アプリケーションの一部として、関連するプログラム用のショートカットバーを追加しました。私はアプリケーションが既に開いているかどうかをチェックし、別のインスタンスを開くのではなく、そのアプリケーションに切り替えるかどうかを調べるように設定しました。これはcalcやメモ帳などのプログラムでうまく動作しますが、すべてのMS Officeプログラムは何があっても別のインスタンスを開きます。WPFアプリケーションからMS Officeを起動する
Officeボタン
private void wordButton_Click(object sender, RoutedEventArgs e)
{
try
{
SwitchToProcess("winword.exe", "C:\\Program Files (x86)\\Microsoft Office\\Office14\\winword.exe");
}
catch (Win32Exception)
{
try
{
SwitchToProcess("winword.exe", "C:\\Program Files\\Microsoft Office\\Office14\\winword.exe");
}
catch (Win32Exception)
{
}
}
}
メモ帳ボタン
private void notepadLink_Click(object sender, RoutedEventArgs e)
{
SwitchToProcess("notepad.exe");
}
方法
private void SwitchToProcess(string name)
{
Process[] procs = Process.GetProcesses();
if (procs.Length != 0)
{
for (int i = 0; i < procs.Length; i++)
{
try
{
if (procs[i].MainModule.ModuleName == name)
{
IntPtr hwnd = procs[i].MainWindowHandle;
ShowWindowAsync(hwnd, SW_RESTORE);
SetForegroundWindow(hwnd);
return;
}
}
catch
{
}
}
}
else
{
MessageBox.Show("No process running");
return;
}
launchApp.StartInfo.FileName = name;
launchApp.Start();
}
private void SwitchToProcess(string name, string path)
{
Process[] procs = Process.GetProcesses();
if (procs.Length != 0)
{
for (int i = 0; i < procs.Length; i++)
{
try
{
if (procs[i].MainModule.ModuleName == name)
{
IntPtr hwnd = procs[i].MainWindowHandle;
ShowWindowAsync(hwnd, SW_RESTORE);
SetForegroundWindow(hwnd);
return;
}
}
catch
{
}
}
}
else
{
MessageBox.Show("No process running");
return;
}
launchApp.StartInfo.FileName = path;
launchApp.Start();
}
理由Officeボタンの2つの異なるディレクトリは、x86/x64のインストール場所で問題が発生しないようにする簡単な方法です。私がこれを開発しているコンピュータは、レジストリがロックアウトされているので、どれが正しいか確認できません。これに
if (procs[i].MainModule.ModuleName == name)
:あなたの次の行を変更する必要がSwitchToProcess
方法で
オフィスが他のドライブにインストールされている場合はどうなりますか? –
私はある時点で、設定タブのセクションを追加してファイルの場所をカスタマイズすることを計画しています。今は、これが単純化して完全に機能するようになると思います。 –