作为应用程序的一部分,我为相关使用的程序添加了快捷方式栏。我设置它来检查应用程序是否已经打开,以及是否要切换到它而不是打开另一个实例。这适用于像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安装位置不会导致问题的简单方法。我为此开发的计算机已将注册表锁定,因此我无法检查哪一个是正确的。
如果办公室安装在其他驱动器上? – 2011-12-22 17:51:51
我打算在某些时候在设置选项卡中添加一个部分来自定义文件位置等。现在认为这可以简化它直到我完全工作。 – 2011-12-22 21:24:13