如何打开文件以便可以通过应用程序启动它?假设注册表使用应用程序所需的路径:
HKEY_CLASSES_ROOT\exefile\shell\open\command

任务是通过应用程序“A”将启动参数传递给"%1" %*将强制通过该应用程序“A”运行的任何文件。
假设我们将文件传输到应用程序,或者通过双击文件启动它,应用程序以文件路径的形式从文件接收参数,如果省略第一个条件,文件“B”必须接收从应用程序“A”启动参数"%1" %*并启动。
static void Main(string[] args)
{
if (args.Any() && BlockChecker.IsBlocked(args[0]) == true)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
else if (args.Any())
{
ProcessStartInfo psi = new ProcessStartInfo((args[0]), @"%1 %*");
psi.WindowStyle = ProcessWindowStyle.Normal;
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
Process.Start(psi);
Application.Exit();
}
}
上述代码有效,但不能接受快捷方式的参数,启动程序(Discord)和(Opera浏览器)时仍然存在错误 他们使用带有启动参数的快捷方式:C:\Users\User\AppData\Local\Discord\Update.exe --processStart Discord.exe
此问题适用于所有具有启动选项的快捷方式或程序...
有关 BlockChecker.cs 类的更多信息:#url
答案是“请不要这样做”的情况之一。更改 EXE 文件的关联是一个坏主意。
首先,这只能通过在资源管理器中打开文件开始。这不适用于启动程序的其他方式 - 通过快捷方式、“打开方式”功能、命令行等。其次,如果出现问题,用户将无法在资源管理器中打开任何 EXE 文件。
此外,防病毒程序可能会将此视为可疑行为(因为某些病毒使用此技术)并阻止或删除您的程序。
我也不明白你为什么需要设置
RedirectStandardOutput. 它在子进程和父进程之间创建了一个链接,这可能会导致问题。如果应用程序是控制台应用程序,则控制台中不会显示任何文本。此外,传递给
ProcessStartInfo字符串"%1 %*"没有任何意义。百分比条目不是真正的选项,而是一个通配符,当调用相关程序时 Explorer 将其更改为特定选项(%* 表示所有选项)。可能,将命令推送到注册表中更有意义,"MyApp.exe %*"以便将所有参数传递给您的程序,然后相应地将 args 的所有内容组合并传输到ProcessStartInfo. 但是,我仍然认为这不是一种工作方式。如果您需要监控程序的启动并执行某些操作,您可以找到最佳解决方案:
监视 Win32_Process 的 WMI InstanceCreationEvent事件(通知到达时至少有 1 秒的延迟)。
使用TraceEvent库(也有一些通知延迟)
开发内核级驱动,使用PsSetCreateProcessNotifyRoutine函数订阅全局进程创建事件
正如用户 Maxim 的回答所建议的那样,拦截 kernel32.dll CreateProcessInternal 函数。
通过 WMI 跟踪进程启动的示例:
显然,您希望所有
EXE文件都通过您的 exe 执行。检查里面有什么args[1],我认为参数应该在那里。例如:PS:这是在开始之前做某事的错误方法
exe。有标准的方法 - 钩子和 dll 注入。