2010-12-08 2 views
5

У меня есть приложение C#, которое я хочу инструктировать, чтобы выключить красиво, из другого процесса. Я также хочу попросить его открыть главное окно. У меня есть ссылка на его главную ручку окна.Как закрыть окно из другого процесса

Я знаю, что могу это сделать, используя сложные схемы, такие как удаленный или WCF. вопрос, что могу я сделать это с помощью простых механизмов, таких как окна сообщений, или OnClose обработчиков событий окна в C# приложении

ответ

6

PInvoke SendMessage(), чтобы отправить сообщение WM_CLOSE в главном окне приложения. Просить его открыть главное окно, вероятно, будет довольно сложно, вы не сможете получить дескриптор окна до тех пор, пока не будет создано окно. Process.Start() будет обычным способом.

Низкозатратная альтернатива WCF и превосходит pinvoke - это именованный канал или сокет для взаимодействия с приложением. Это требует возможности изменить исходный код приложения.

+1

В конце концов, я пошел с этим, подход, в сочетании с двумя полезными ответами в других вопросах: 1. [как обрабатывать сообщения окна в wpf] (http://stackoverflow.com/questions/624367/how -to-handle-wndproc-messages-in-wpf) 2. [как передать сообщение всем окнам, включая закрытые/невидимые] (http://stackoverflow.com/questions/1777668/send- сообщение к-а-Windows-процессу-не-его-главное окно) – 2010-12-09 11:04:23

2

Я думаю, что вы могли бы использовать FindWindow найти правильное окно ребенка, а затем SendMessage или PostMessage, чтобы отправить WM_CLOSE.

Вот еще один StackOverflow question, который занимается этим в C#.

Редактировать: Хотя, как говорит другой ответ в этом вопросе, вы, возможно, сможете использовать Process.CloseMainWindow.

0

Я бы в первую очередь сделал целевое приложение «осведомленным» о том, что какой-то другой процесс может вызвать его закрытие или открытие окна или выполнение каких-либо действий. Это должно быть реализовано аналогично вызову любого метода в другом процессе с помощью api или общедоступных методов целевого приложения. Если вы не пытаетесь сделать что-то с сторонними приложениями, я думаю, вам не следует пытаться напрямую отправлять им сообщения для закрытия или завершения работы.