В рамках приложения я добавил панель быстрого доступа для соответствующих программ. Я настроил его, чтобы проверить, открыто ли уже приложение, и нужно ли переключиться на него вместо открытия другого экземпляра. Это прекрасно работает для таких программ, как calc и notepad, но все программы 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 не вызывают проблем. На компьютерах, для которых я разрабатываю эту программу, реестр заблокирован, поэтому я не могу проверить, какой из них правильный.