Запретить пользователю закрывать приложение, открываемое через программу на C#

У меня есть старая программа на основе командной строки (ее Fortran, если это имеет значение), которая открывается из приложения C#, когда пользователь нажимает кнопку. Если программа командной строки закрывается во время работы, данные становятся поврежденными. Есть ли способ предотвратить отключение людей во время его работы? Например, сделать [x] недоступным или как-то встроить программу в мою?

 System.Diagnostics.Process pname =
 System.Diagnostics.Process.Start(Path.Combine(Application.StartUpPath,
"diag_main.exe"));

    pname.Exited += new EventHandler(pname_Exited);

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

5 ответов

Решение

Решение, которое займет приличное количество программирования, но может быть сделано:

Напишите отдельную программу, которая перехватывает вывод программы на экран и каким-то образом отправляет ее в вашу программу. Запустите эту программу в скрытом окне, она развернется, запустит приложение и отправит вывод вашей программе.

По крайней мере, части перехватчика почти наверняка должны быть в сборе.

Редактировать: перенаправление stdout не будет делать, даже если программа только пишет в него - он хочет, чтобы вывод выводился.

Есть три вещи, которые, возможно, должны быть перехвачены:

Int 21h файловая система пишет. Это те вещи, которые могут быть перехвачены перенаправлением stdout. Помните, что некоторые программы могут писать в другой номер дескриптора, который фактически представляет файл stdout - найдите дескриптор, в который записывается в таблице дескрипторов программы, и сравните его с записью stdout (IIRC вторая запись)- если они совпадают это на самом деле вывод на экран.

Второй уровень IIRC int 10h. Есть несколько дополнительных вызовов, которые должны быть перехвачены.

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

Во всех трех случаях, по крайней мере, части рутины должны быть написаны на ассемблере.

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

К сожалению нет. Если другая программа имеет пользовательский интерфейс, вы не сможете скрыть ее от пользователя. Если этого не произойдет, вы можете запустить его, не открывая окно консоли, используя ProcessStartInfo учебный класс. Даже если вы сделаете это, они все равно могут убить его с помощью диспетчера задач.

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

При создании объекта процесса используйте перегрузку конструктора, которая принимает ProcessStartInfo объект. Установить WindowStyle свойство этого к ProcessWindowStyle.Hidden и CreateNoWindow собственность на true:

ProcessStartInfo startInfo = new ProcessStartInfo("fortranApp.exe");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.CreateNoWindow = true;

Process.Start(startInfo);

Конечно, он все равно будет отображаться в списке процессов и может быть уничтожен таким образом, но по крайней мере это предотвратит любое непреднамеренное отключение.

Вы можете попробовать использовать ProcessStartInfo и установить свойство CreateNoWindow чтобы правда и установить WindowStyle в ProcessWindowStyle.Hidden, Я сам не пробовал, но может тебе повезло.

Если программа загружается в cmd окно, то нет, нет способа помешать пользователю просто закрыть окно. Лучшим подходом было бы запустить программу в фоновом режиме, где она скрыта от случайных пользователей. Злонамеренный пользователь все еще может найти процесс и убить его, но это, вероятно, будет меньшей проблемой.

Вы можете сделать это с помощью следующего:

var psi = new ProcessStartInfo();
psi.CreateNoWindow = true;
/// etc.
Другие вопросы по тегам