Вы не должны тестировать взаимодействие класса и функциональный вызов. вместо этого необходимо рассмотреть интеграционное тестирование. Протестируйте необходимый результат а не операцию загрузки файла.
Вместо того, чтобы пытаться убить процесс при его запуске, как насчет того, чтобы в первую очередь остановить его выполнение?
Изменить то, что происходит, когда оболочка пытается запустить приложение, просто - добавить новый раздел реестра для HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Image File Execution Options
Чтобы проверить это, я добавил раздел реестра с именем notepad.exe и внутри него строковое значение Отладчик со значением calc.exe . Теперь всякий раз, когда я пытаюсь запустить блокнот, открывается калькулятор. Ниже представлен экспортированный раздел реестра.
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe]
"Debugger"="calc.exe"
После внесения этого изменения мне еще не удалось открыть блокнот, что неплохо для решения без кода. Если вам нужно быть на 100% уверенным, что приложение никогда не запускается, вы всегда можете добавить решение «убить», как это подробно описано другими.
Перехватчик Windows должен решить вашу проблему. Я никогда не пробовал этого ... но для этого вам нужно будет сделать некоторые вызовы API Win32. Подцепите Google Win32 и посмотрите.
Просто небольшое дополнение к отличному ответу Стивена Натта:
Если вы хотите, чтобы программа ушла навсегда, не показывайте вместо нее что-нибудь другое (calc.exe в примере Стивена). Укажите ключ: "Debugger" = "ntsd -cq"
Это вызовет вездесущий отладчик командной строки NT ntsd для программы с аргументом командной строки -c со словами «выполнить указана следующая команда отладчика "; команда отладчика - q (что означает выход). Это остановит отладчик, что, как побочный эффект, убьет отладчик - программу, запуск которой вы хотите предотвратить.
Чисто, красиво и легко. Единственный побочный эффект, который я заметил, - это то, что иногда на короткое время появляется временное командное окно с приглашением отладчика, которое через мгновение снова исчезает.
instead of waiting for the executable to open, so you can close it again, you can also just cripple the executable.
just change a few of the bytes in the exe header and prevent it that way from ever starting.
Just do it in a way that the effect is reversible.
Вы можете написать глобальный перехватчик.
То, что будет перехвачено, менее важно, чем тот факт, что он будет глобальным и, следовательно, реализован в отдельной DLL. В этой библиотеке вы правильно обрабатываете присоединение к новому модулю. Если вы обнаружили дубликат процесса - убейте его.
internal static class Program
{
private static Mutex m;
[STAThread]
private static void Main()
{
bool flag;
m = new Mutex(true, "ProgramName", out flag);
if (!flag)
{
MessageBox.Show("Another instance is already running.");
}
else
{
//start program
}
}
}
Я использую это в программе, и он отлично работает, и он должен иметь возможность изменить это для ваших нужд.
I remember some Win32 functionality which helps solving such scenarios. If you are using .Net anyway that would probably a pain to implement. I would use some of the cross-process synchronization objects (don't know out of my head which ones are cross-process) and would set some signal. At startup just let your app check whether the signal is already set. If yes, just close the app again.
private bool KillProcess(string name)
{
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.ToLower().StartsWith(name.ToLower()))
{
clsProcess.Kill();
return true;
}
}
return false;
}
да, это метод, который я использую до сих пор. Это закроет приложение после того, как оно было открыто, так что я получу около 90%. Я использую таймер, который проверяет каждые 10 секунд. Мне просто интересно, стоит ли тратить время на исследование ловушки Windows (о которой я ничего не знаю) для удобства мгновенной блокировки приложений. Те из вас, кто знаком с Win32 api, стоит ли прилагать усилия?
One of the ideas, but not the best is to watch the running processes and kill the needed running process when found, this can be done with normal managed C# code.
Хорошо, я только что нашел приложение, которое искал изначально.
Оно называется Temptation Blocker и доступно здесь
Оно найдет все исполняемые файлы и позволит вам выберите, что блокировать на сколько часов.
Это не идеально, я бы хотел, чтобы он запускался автоматически, поэтому мне не нужно запускать его вручную, но кроме этого он довольно хорош