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