2011-12-22 106 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

相关问题