Учитывая, что Process.CloseMainWindow () работает, указывает, что обе программы работают на одной машине. Учитывая, что настоящая служба не может запускать программы, которые больше видны на рабочем столе, это означает, что ваша серверная программа работает как обычное пользовательское приложение.
Теперь больше не имеет смысла иметь отдельные программы. Просто попросите сервер создать видимое окно. Взаимодействие тривиально, поскольку все выполняется в одной программе и имеет доступ ко всем состояниям этой программы.
Если обработка сервера мешает поддерживать окно клиента активным, то отобразить это окно в потоке. Этот вспомогательный класс выполняет свою работу:
using System;
using System.Threading;
using System.Windows.Forms;
static class ClientView {
private static Form mView;
public static void Start(Form view) {
if (Busy) throw new InvalidOperationException("View already running");
mView = view;
mView.FormClosed += (o, e) => { mView = null; }
Thread t = new Thread(() => Application.Run(view));
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
public static void Stop() {
if (Busy) mView.Invoke(new MethodInvoker(() => mView.Close()));
}
public static bool Busy { get { return mView != null; } }
}
Пример использования:
ClientView.Start(new ClientForm());