2011-12-22 158 views
0

作爲應用程序的一部分,我爲相關使用的程序添加了快捷方式欄。我設置它來檢查應用程序是否已經打開,以及是否要切換到它而不是打開另一個實例。這適用於像calc和notepad這樣的程序,但所有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按鈕中的兩個不同目錄是確保x86/x64安裝位置不會導致問題的簡單方法。我爲此開發的計算機已將註冊表鎖定,因此我無法檢查哪一個是正確的。

+0

如果辦公室安裝在其他驅動器上? – 2011-12-22 17:51:51

+0

我打算在某些時候在設置選項卡中添加一個部分來自定義文件位置等。現在認爲這可以簡化它直到我完全工作。 – 2011-12-22 21:24:13

回答

0

好了,挖得更深一些,到谷歌之後,我終於想通了這個問題。我有針對x86處理器的程序,並在x64上運行它。將目標切換到AnyCPU並且完美運行。顯然它是捕獲錯誤Only part of a ReadProcessMemory or WriteProcessMemory request was completed,但由於我有try-catch塊在那裏它沒有顯示錯誤,直到我在77項處理器陣列上反覆使用StepInto。謝謝大家的幫助。

3

在你SwitchToProcess方法,你需要更改以下行:

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

要這樣:

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

原因是對詞的進程名是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文件夾。 – 2011-12-22 21:22:22

+0

這可能是值得檢查任務管理器,看看什麼是WINWORD.EXE的圖像名稱,我認爲它可能是WINWORD.EXE * 32你需要尋找 - 我假設Office安裝是64位的32位機器嗎? – 2011-12-22 23:29:41

相關問題