分析

分析

我注意到当我按下Ctrl+ Alt+Del并单击任务管理器时,Windows 会调用taskmgr.exe /3命令。几个网站声称任务管理器没有命令行参数。

进程资源管理器中的任务管理器进程

为什么 Windows 会附加这个参数?

答案1

分析

显然这不是一个有记录的行为。我做了一些测试,并记录了我的发现:

  • 右键单击任务栏,然后单击启动任务管理器

    "C:\Windows\system32\taskmgr.exe" /4
    
  • Ctrl+ Shift+ Esc

    taskmgr.exe /2
    
  • Ctrl+ Alt+ Del,然后点击启动任务管理器

    taskmgr.exe /3
    
  • 启动非提升的任务管理器,然后单击显示所有用户的进程按钮。

    "C:\Windows\system32\taskmgr.exe" /1
    
  • taskmgr.exe在开始菜单搜索栏中键入或粘贴,然后按Enter;按Win+ Rtaskmgr.exe在文本框中键入或粘贴,然后按Enter;导航到System32文件夹并双击taskmgr.exe可执行文件;启动系统配置实用程序(msconfig.exe),单击工具选项卡,从列表中选择任务管理器项,然后单击发射

    "C:\Windows\system32\taskmgr.exe"
    
  • 打开命令提示符,键入或粘贴taskmgr.exe,然后按Enter

    taskmgr.exe
    

评论

  • 在 Windows 8 的开发阶段直至发布预览版,情况都类似。Windows Vista 和更早的操作系统不受影响。

  • 可执行文件导入了几个API函数(即GetCommandLineWCommandLineToArgvW)用于检索和解析命令行参数。

  • 使用上述任何参数手动启动程序似乎没有任何明显的效果。

如果我必须做出有根据的猜测,我会说数字参数是一个内部启动指示器,可能用于调试目的,然后被遗忘。

答案2

几点说明:

仅仅因为发送了命令,并不意味着程序接受这些参数或任何参数。

例如:

我用自己的奇怪命令调用了任务管理器,但行为没有改变:

在此处输入图片描述

从基本的编程角度来看,任何应用程序都会有某种类型的主方法,其中的参数传入。例如,一个基本的 Windows Form C# 应用程序看起来像这样:

private void Form1_Load(object sender, EventArgs e)
        {

        }

如果我传递一些奇怪的参数,应用程序不会发生任何事情,但 Process Explorer 会捕获并显示它们。

在此处输入图片描述

但是,如果我明确决定处理它们,您将获得来自命令的交互。

在此处输入图片描述

我所要做的只是稍微改变一下表单的入口点:

private void Form1_Load(object sender, EventArgs e)
        {
            string arguments = Environment.GetCommandLineArgs()[1];

            this.Text = arguments;
        }

现在,回到你的问题:为什么它在那里:

ctrl如果您从+ alt+方法访问 taskmgr.exe del,您确实会看到命令参数“/3”。此外,如果您使用ctrl+ shift+,esc它会传递 /2,如果您右键单击任务栏并单击“启动任务管理器”,则显示的开关是 /4。

所有这些让我猜测也许 Windows 需要知道一些事情,或者可能几乎为 Taskmanager 实现了我们不知道的事情。例如,Windows 中的安全性可能想知道是否使用ctrl++来调用 taskmgr.exe,而不是脚本或用户。同样,altdel纯粹是猜测,但类似这样的主题让我认为这至少是一个想法。


对于臭名昭著的总结

要知道 Windows 为何传递这些命令,我​​们可能需要微软开发团队的成员或源代码。也许没有更好的答案。

答案3

如果我没记错的话,虽然记忆模糊,但我想我是想为自己提供一种方法来了解我是通过什么机制启动的。这样我就能知道它是来自Ctrl++还是Shift托盘Esc还是开始菜单等。

最终我认为这些信息被证明是不必要的,所以它可能会被忽略,但仍然编码在启动它的人的行为中。

相关内容