MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как открыть файл с помощью команды приложения?"
Answer 769179
Один из тех случаев, когда ответ - "Пожалуйста, не делайте этого". Изменять ассоциации для EXE файлов - плохая идея.
Во-первых, это работает только для запуска путем открытия файла в проводнике. Это не распространяется на другие способы запуска программ - через ярлыки, функцию "Открыть с помощью", командную строку и т.п. Во-вторых, если что-то пойдет не так, пользователь не сможет открыть в проводнике ни один EXE-файл.
Также антивирусные программы могут воспринимать это как подозрительное поведение (так как некоторые вирусы используют эту методику) и заблокировать или удалить вашу программу.
Не понимаю также, зачем вам устанавливать свойство
RedirectStandardOutput
. Оно создает связь между дочерним и родительским процессами, которая может привести к возможным проблемам. Если приложение консольное, текст в консоли не будет выводиться.Далее, передача в
ProcessStartInfo
строки"%1 %*"
не имеет никакого смысла. Запись с процентами - это не настоящие параметры, а подстановочный знак, который проводник меняет на конкретные параметры при вызове ассоциированной программы (%* означает все параметры). Вероятно, больший смысл бы имело в реестр запихать команду"MyApp.exe %*"
, чтобы вашей программе передавались все параметры, и потом соответственно, все содержимое args объединять и передавать вProcessStartInfo
. Но все равно, я не думаю, что это рабочий способ.
Если вам нужно отслеживать запуск программ и выполнять определенные действия, можно найти лучшее решение:
Отслеживание события WMI InstanceCreationEvent для Win32_Process (уведомление приходит с задержкой минимум в 1 секунду).
Использование библиотеки TraceEvent (также имеется некоторая задержка уведомления)
Разработать драйвер уровня ядра, и использовать функцию PsSetCreateProcessNotifyRoutine для подписки на глобальное событие создания процесса
Перехват функции kernel32.dll CreateProcessInternal, как предлагает ответ пользователя Максим.
Пример для отслеживания запуска процесса через WMI:
using System; using System.Management; //https://msdn.microsoft.com/en-us/library/system.management.managementeventwatcher(v=vs.110).aspx public class EventWatcherPolling { public static int Main(string[] args) { // Create event query to be notified within 1 second of // a change in a service WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", TimeSpan.FromSeconds(1), "TargetInstance isa \"Win32_Process\""); // Initialize an event watcher and subscribe to events // that match this query ManagementEventWatcher watcher = new ManagementEventWatcher(); watcher.Query = query; // Block until the next event occurs Console.WriteLine( "Waiting for events..."); ManagementBaseObject e; while (true) { try { e = watcher.WaitForNextEvent(); //Display information from the event Console.WriteLine( "Process {0} has been created, path is: {1}, id is {2}", ((ManagementBaseObject)e["TargetInstance"])["Name"], ((ManagementBaseObject)e["TargetInstance"])["ExecutablePath"], ((ManagementBaseObject)e["TargetInstance"])["ProcessId"] ); } catch (Exception ex) { Console.WriteLine(ex.ToString()); Console.ReadKey(); } } return 0; } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.