Способ остановить запуск программы с помощью C#?

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

Допустим, у меня есть игра, в которую я не хочу играть в течение недели. Поэтому, если я запустлю его в любой день, кроме пятницы / субботы / воскресенья, он будет перехватываться и отменяться. Это возможно с C#?

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

8 ответов

Решение

Что ж, вы можете определенно определить, какие программы запущены, ища имена процессов, которые вы хотите (GetProcessesByName()) и убивая их.

Process[] processes = Process.GetProcessesByName(processName);
foreach(Process process in processes)
{
   process.Kill();
}

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

Я не знаю, в частности, о C#, но одна из причин, по которой вы могли бы сделать это (я буду опасным способом), заключается в использовании параметров выполнения файла изображения ( http://blogs.msdn.com/junfeng/archive/2004/04/28/121871.aspx) в реестре. Для любого исполняемого файла, который вы хотите перехватить, вы можете установить для него параметр Debugger, а затем создать небольшое приложение, которое будет использоваться в отладчике, а затем по существу отфильтровать эти вызовы. Если вы хотите, чтобы он работал, запустите процесс, в противном случае делайте что хотите. Я никогда не пытался это сделать, но кажется, что он может делать то, что вы хотите.

Или, если вы хотите отреагировать на запуск процесса, а затем закрыть его, вы можете использовать ProcessWatcher ( http://weblogs.asp.net/whaggard/archive/2006/02/11/438006.aspx) и подписаться на обработайте созданное событие, а затем закройте его, если необходимо. Однако это скорее реактивный подход, а не упреждающий, как первый.

Это приложение будет делать только что убить процесс от оранжевой лампы
Я не автор.

Там всегда есть крючки. Хотя в библиотеке.net его нет, вы всегда можете обернуть Win32 DLL. Вот хорошая статья: http://msdn.microsoft.com/sv-se/magazine/cc188966(en-us).aspx

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

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

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Параметры выполнения файла изображения] является ключом, для получения дополнительной информации обратитесь к статье MS http://support.microsoft.com/default.aspx?kbid=238788.

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

Вы могли бы даже сделать это в AutoIt!

Вытащить Petzold и повеселиться с окнами...

РЕДАКТИРОВАТЬ: Проверьте sysinternals для источника о том, как составить список активных процессов - сделать это в цикле, и вы можете поймать вашу программу при запуске. Я не думаю, что официальный сайт по-прежнему имеет источник, но он обязательно где-то там...

Хм, вместо того, чтобы перехватывать его запуск, возможно, ваша служба может каким-то образом саботировать исполняемый файл (то есть копаться в разрешениях, переименовывать EXE, заменять EXE чем-то, что ругает вас за слабость и т. Д.).

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

http://www.codeproject.com/KB/system/win32processusingwmi.aspx

http://msdn.microsoft.com/en-us/magazine/cc188966.aspx

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

Другие вопросы по тегам