Как я мешаю приложению открыться

Вы не должны тестировать взаимодействие класса и функциональный вызов. вместо этого необходимо рассмотреть интеграционное тестирование. Протестируйте необходимый результат а не операцию загрузки файла.

8
задан Spidey 16 August 2009 в 16:23
поделиться

10 ответов

Вместо того, чтобы пытаться убить процесс при его запуске, как насчет того, чтобы в первую очередь остановить его выполнение?

Изменить то, что происходит, когда оболочка пытается запустить приложение, просто - добавить новый раздел реестра для 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% уверенным, что приложение никогда не запускается, вы всегда можете добавить решение «убить», как это подробно описано другими.

12
ответ дан 5 December 2019 в 08:54
поделиться

Перехватчик Windows должен решить вашу проблему. Я никогда не пробовал этого ... но для этого вам нужно будет сделать некоторые вызовы API Win32. Подцепите Google Win32 и посмотрите.

1
ответ дан 5 December 2019 в 08:54
поделиться

Просто небольшое дополнение к отличному ответу Стивена Натта:

Если вы хотите, чтобы программа ушла навсегда, не показывайте вместо нее что-нибудь другое (calc.exe в примере Стивена). Укажите ключ: "Debugger" = "ntsd -cq"

Это вызовет вездесущий отладчик командной строки NT ntsd для программы с аргументом командной строки -c со словами «выполнить указана следующая команда отладчика "; команда отладчика - q (что означает выход). Это остановит отладчик, что, как побочный эффект, убьет отладчик - программу, запуск которой вы хотите предотвратить.

Чисто, красиво и легко. Единственный побочный эффект, который я заметил, - это то, что иногда на короткое время появляется временное командное окно с приглашением отладчика, которое через мгновение снова исчезает.

5
ответ дан 5 December 2019 в 08:54
поделиться

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.

0
ответ дан 5 December 2019 в 08:54
поделиться

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

То, что будет перехвачено, менее важно, чем тот факт, что он будет глобальным и, следовательно, реализован в отдельной DLL. В этой библиотеке вы правильно обрабатываете присоединение к новому модулю. Если вы обнаружили дубликат процесса - убейте его.

0
ответ дан 5 December 2019 в 08:54
поделиться
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
        }
    }
}

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

0
ответ дан 5 December 2019 в 08:54
поделиться

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.

0
ответ дан 5 December 2019 в 08:54
поделиться
    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, стоит ли прилагать усилия?

0
ответ дан 5 December 2019 в 08:54
поделиться

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.

0
ответ дан 5 December 2019 в 08:54
поделиться

Хорошо, я только что нашел приложение, которое искал изначально.

Оно называется Temptation Blocker и доступно здесь

Оно найдет все исполняемые файлы и позволит вам выберите, что блокировать на сколько часов.

Это не идеально, я бы хотел, чтобы он запускался автоматически, поэтому мне не нужно запускать его вручную, но кроме этого он довольно хорош

1
ответ дан 5 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: