2011-12-22 11 views
0

アプリケーションの一部として、関連するプログラム用のショートカットバーを追加しました。私はアプリケーションが既に開いているかどうかをチェックし、別のインスタンスを開くのではなく、そのアプリケーションに切り替えるかどうかを調べるように設定しました。これは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方法で

+0

オフィスが他のドライブにインストールされている場合はどうなりますか? –

+0

私はある時点で、設定タブのセクションを追加してファイルの場所をカスタマイズすることを計画しています。今は、これが単純化して完全に機能するようになると思います。 –

答えて

0

[OK]を、ので、グーグルに少し深く掘り後、私は最終的に問題を考え出しました。私はx86プロセッサを対象としたプログラムを持っていて、x64上で実行しています。ターゲットをAnyCPUに切り替えると完全に動作します。どうやらそれはOnly part of a ReadProcessMemory or WriteProcessMemory request was completedのエラーをキャッチしていましたが、そこにtry-catchブロックがあったので、77アイテムのプロセッサ配列でStepIntoを繰り返し使用するまでエラーは表示されませんでした。しかし、皆さん、助けをありがとう。

3

if (procs[i].MainModule.ModuleName.ToLower() == name.ToLower()) 

理由は、Wordのプロセス名がWINWORD.EXEであり、あなたが渡しているということで小文字のパラメータ値。さておき、あなたがこれにあなたのwordButton_Clickイベントを変更することができますよう

private void wordButton_Click(object sender, EventArgs e) 
{ 
      if (Environment.Is64BitOperatingSystem) 
      { 
       SwitchToProcess("winword.exe", "C:\\Program Files (x86)\\Microsoft Office\\Office14\\winword.exe"); 
      } 
      else 
      { 
       SwitchToProcess("winword.exe", "C:\\Program Files\\Microsoft Office\\Office14\\winword.exe"); 
      } 
} 
+0

これを投稿する前に大文字と小文字の両方を入力しようとしましたが、動作しませんでした。私はToLower()を追加してもう一度試しましたが、それでも動作しません。いずれにしても、私はそこにToLowerを持っているのが好きです。他のプログラムが上または下にあると潜在的な問題を避けることができます。環境の提案に関しては、それを使用するコンピュータが64ビットであることを除いて、私はそれを使用します。何故なら、何らかの理由でx86フォルダにインストールしたばかりです。 –

+0

タスクマネージャをチェックして、イメージ名がWINWORD.EXEのものであることを確認してください。WINWORD.EXE * 32と思われます.Officeのインストールは64bitで32bitと仮定していますマシン? –

関連する問題