我注意到当我按下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+ R,taskmgr.exe
在文本框中键入或粘贴,然后按Enter;导航到System32
文件夹并双击taskmgr.exe
可执行文件;启动系统配置实用程序(msconfig.exe
),单击工具选项卡,从列表中选择任务管理器项,然后单击发射。"C:\Windows\system32\taskmgr.exe"
打开命令提示符,键入或粘贴
taskmgr.exe
,然后按Enter。taskmgr.exe
评论
在 Windows 8 的开发阶段直至发布预览版,情况都类似。Windows Vista 和更早的操作系统不受影响。
可执行文件导入了几个API函数(即
GetCommandLineW
和CommandLineToArgvW
)用于检索和解析命令行参数。使用上述任何参数手动启动程序似乎没有任何明显的效果。
如果我必须做出有根据的猜测,我会说数字参数是一个内部启动指示器,可能用于调试目的,然后被遗忘。
答案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,而不是脚本或用户。同样,alt这del纯粹是猜测,但类似这样的主题让我认为这至少是一个想法。
对于臭名昭著的总结
要知道 Windows 为何传递这些命令,我们可能需要微软开发团队的成员或源代码。也许没有更好的答案。
答案3
如果我没记错的话,虽然记忆模糊,但我想我是想为自己提供一种方法来了解我是通过什么机制启动的。这样我就能知道它是来自Ctrl++还是Shift托盘Esc还是开始菜单等。
最终我认为这些信息被证明是不必要的,所以它可能会被忽略,但仍然编码在启动它的人的行为中。