Проблемы с запуском удаленного процесса из C # - PullRequest
3 голосов
/ 25 июня 2011

Я использую System.Diagnostics.Process.Start для запуска удаленного приложения на другом доменном компьютере.

К сожалению, если удаленный процесс уже запущен, но в фоновом режимена рабочем столе удаленного компьютера, приложение не получает фокус с помощью Process.Start.

Вопрос 1: Существует ли другой API или механизм, который заставляет удаленное приложение получить фокус или мигает допривлечь внимание пользователя?

Другая проблема, которую я заметил, заключается в том, что если удаленный процесс уже запущен, новый экземпляр может быть выполнен в дополнение к оригиналу.Это нарушает документацию MSDN, в которой говорится:

"Если процесс уже запущен, дополнительный ресурс процесса не запускается. Вместо этого существующий ресурс процесса используется повторно, и новый компонент Process не создается. В таком случаеВ этом случае вместо возврата нового компонента Process Start возвращает пустую вызывающую процедуру. "

Вопрос 2: Кто-нибудь нашел способ предотвратить второй экземпляр приложения?от запуска в этом случае?Является ли WMI лучшим выбором для удаленного запуска приложений?

1 Ответ

2 голосов
/ 25 июня 2011

Ну, не знаю, насколько хорошо это будет работать для вас, но это пример класса, который вы можете использовать в вспомогательной программе. Это только начало, если вы планируете использовать его, вам понадобится сетевая система (хотя и не плохо с C #). Скажите, как это работает для вас.

/// <summary>
/// Allows you to start a specified program, or if it is already running, bring it into focus
/// </summary>
static class SFProgram
{
    static public void StartFocus(string FileName, string ProcessName)
    {
        if (!ProcessStarted(ProcessName))
            Process.Start(FileName);
        else
            SFProgram.BringWindowToTop("notepad");
    }

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll")]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    /// <summary>
    /// Bring specified process to focus
    /// </summary>
    /// <param name="windowName">Process Name</param>
    /// <returns>If it was successful</returns>
    private static bool BringWindowToTop(string windowName)
    {
        Process[] processes = Process.GetProcessesByName(windowName);
        foreach (Process p in processes)
        {
            int hWnd = (int)p.MainWindowHandle;
            if (hWnd != 0)
            {
                return SetForegroundWindow((IntPtr)hWnd);
            }
            //p.CloseMainWindow();
        }
        return false;
    }

    private static bool ProcessStarted(string ProcessName)
    {
        Process[] processes = Process.GetProcessesByName(ProcessName);
        return (processes.Length > 0);
    }
}
...