Приложение «Захват» окна при неожиданном завершении позволяет исчезнуть захваченным окнам, как я могу предотвратить / устранить эту проблему? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть приложение (C # + WPF), которое пытается получить контроль над графическим интерфейсом любого процесса, переданного ему в качестве входных данных, и изменить его размер / положение для моих собственных целей.

Думаю, он неплохо справляется со своей задачей. После ожидаемого завершения (базовый класс наследует от IDisposable) «захваченный» процесс освобождается - его родительский элемент устанавливается на исходный, его стиль окна сбрасывается и т. Д. И т. Д.

Фактически, при тестировании я могу захватывать, выпускать, повторно захватывать и т. Д. Тот же процесс, что и много раз раз, как я хочу, без проблем.

Однако при неожиданном завершении (скажем, другой процесс принудительно убивает его) процесс никогда не восстанавливает свой графический интерфейс! Я могу сказать, что он все еще работает, но я никогда не смогу вернуть этот процесс в исходное состояние.

Похоже, что процесс больше не отвечает на вызовы Win32 API на основе окна, которые больше устанавливают определенные оконные функции (например, я могу получить информацию с помощью GetParent, GetWindowThreadProcessId и т. Д., Но вызов ShowWindow или связанных результатов ни к чему не приводит).

Есть предложения, почему это происходит? Я предполагаю, что, поскольку я установил родителем процесса свое приложение WPF (которое затем неожиданно закрывается), это вызывает некоторые проблемы при попытке восстановить исходный интерфейс?

Вот почему это происходит (или, по крайней мере, указание на то, почему мне было так трудно разобраться в этой проблеме самостоятельно); я могу восстановиться после этого? И если да, то как?

Редактировать -

IInspectable дает хорошее замечание в комментариях, вопрос скорректирован для лучшего понимания этого конкретного приложения.

1 Ответ

0 голосов
/ 13 сентября 2018

Кажется, я получил свой ответ;Итак, для полноты картины я опубликую то, что я получил здесь, в случае, если у кого-то еще есть подобная проблема.

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

Мое решение:

Восстановление (по крайней мере, в тот момент, о котором я говорю - т.е. неожиданные сбои или выходы), вероятно, неосуществимо, так как мыМы уже ушли из конца в неопределенном / неизвестном поведении.Поэтому я решил пойти по пути предупреждения.

В нашем текущем проекте уже используется инфраструктура Nancy для взаимодействия между серверами / процессами, поэтому я собираюсь «усовершенствовать» нашПроцедура завершения немного для моей части программы, чтобы позволить ей выходить изящнее.

В случае истинно неожиданного завершения, я все еще в растерянности.Я мог бы просто перезапустить процессы (на самом деле это сервисы с консольным выходом, в нашем случае, но без w), но мое приложение - это просто графический интерфейс / интерфейс и не очень важно по сравнению с функцией, которую онипроцессы служат.Я могу создать своего рода файл семафора, который указывает, происходит ли успешное завершение работы, и разветвлять мой код, чтобы он указывал, что процессы больше не видны до следующего перезапуска.

...