Запретить пользователю закрывать приложение, открываемое через программу на C # - PullRequest
5 голосов
/ 25 июля 2010

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

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

    pname.Exited += new EventHandler(pname_Exited);

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

Ответы [ 5 ]

2 голосов
/ 25 июля 2010

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

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

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

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

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

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

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

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

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

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

1 голос
/ 25 июля 2010

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

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

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

Process.Start(startInfo);

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

1 голос
/ 25 июля 2010

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

0 голосов
/ 25 июля 2010

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

0 голосов
/ 25 июля 2010

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

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

...