作爲應用程序的一部分,我爲相關使用的程序添加了快捷方式欄。我設置它來檢查應用程序是否已經打開,以及是否要切換到它而不是打開另一個實例。這適用於像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