Запуск MS Office из приложения WPF - PullRequest
0 голосов
/ 22 декабря 2011

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

Ответы [ 2 ]

3 голосов
/ 22 декабря 2011

В вашем методе SwitchToProcess вам нужно изменить следующую строку:

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

На это:

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

Причина в том, что имя процесса для Word - 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 голосов
/ 23 декабря 2011

Хорошо, так что, покопавшись немного глубже в Google, я наконец-то понял проблему.У меня была программа, предназначенная для процессора x86, и я запускаю ее на x64.Переключил цель на AnyCPU, и она работает отлично.По-видимому, он ловил ошибку Only part of a ReadProcessMemory or WriteProcessMemory request was completed, но, поскольку у меня там был блок try-catch, он не отображал ошибку, пока я неоднократно использовал StepInto в массиве процессора из 77 элементов.Спасибо всем за помощь, хотя.

...