65.9K
CodeProject 正在变化。 阅读更多。
Home

命令行参数上下文菜单扩展

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.23/5 (6投票s)

2000年5月10日

viewsIcon

95465

downloadIcon

1285

允许直接从Explorer运行带有命令行参数的程序。

  • 下载源文件 - 376 Kb

    Sample Image - CmdLineExt1.jpg

    引言

    这是(可能四篇)上下文菜单扩展系列文章中的第二篇。

    尽管Windows程序面向GUI,但有时仍需要向程序传递命令行参数。在我看来,最突出的例子是ATL服务:为了注册其中的COM对象,必须运行带有命令行参数“/regserver”或“/service”的可执行文件。直到现在,只有几种相当繁琐的方法可以完成这项任务。

    • 命令提示符:打开命令提示符,导航到可执行文件所在的目录,然后键入可执行文件以及所有必需的参数。这通过“Command Prompt Here”PowerToy变得容易了一些,但仍然很麻烦。
    • 运行对话框:使用开始菜单中的“运行”对话框可以起作用,但可执行文件必须在路径中,或者必须提供完整路径。
    • 快捷方式:创建可执行文件的快捷方式,并在快捷方式的属性对话框中指定命令行参数。
    • 批处理文件:编写一个老式的批处理文件来完成工作。

    正如我在上一篇文章中以及其上的一些评论中所提到的,我对于重复性任务非常懒惰。如果一项任务可以通过一次点击完成,我不想花费三次点击。考虑到这一点,我创建了这个上下文菜单扩展,它只需要鼠标点击几次和最少的输入,就可以完成上述方法相同的工作。

    只需从上下文菜单中选择“Run with Parameters”,您就会看到一个简洁的对话框,允许您指定命令行参数。该扩展具有自动完成功能(类似于Netscape和MSIE)、下拉历史记录列表,以及为了怀旧,一个闪烁的DOS提示符。

    代码

    代码有很好的文档记录,所以这里不详细介绍,但我会给出一个概述。代码的IContextMenu/IShellExtInit部分是相当标准的,它只是添加菜单项、提供帮助文本,并在用户选择该项时做出响应。对话框的代码稍微复杂一些,主要是由于将历史记录保存到注册表的机制。这种方法受到了看到各种Norton程序存储历史记录方式的启发,所以我想我不会因原创性而获得积分。

    命令以这种方式存储在注册表中

    键名

    "Order"

    "adbce"

    "a"

    "/regserver"

    "b"

    "/service"

    "c"

    "/unregserver"

    "d"

    "-install"

    "e"

    "-flytothemoon"

    顾名思义,字符串将按照“Order”键指定的顺序出现在下拉组合框中。在此示例中,是/regserver后跟-install后跟/service等。当用户输入列表中不存在的参数时,该值将保存到下一个可用键(在此例中为“f”)中,并且其名称将前缀添加到顺序字符串(例如,“fadbce”)。如果历史记录列表已满,则顺序字符串中的最后一个项目(此处为“e”)将被占用并移到队列的开头。在上面的示例中,键“e”将接收新参数值,并且“Order”键将变为“eadbc”。当用户选择列表中已有的项目之一时,键名将被简单地移到顺序字符串的头部。因此,如果用户选择“/unregserver”,顺序字符串将变为“cadbe”。

    自动完成功能相当简单。响应组合框的CBN_EDITCHANGE消息,程序会检查输入的字符串是否是列表中字符串的前缀。如果是,则匹配的剩余部分将被附加并被选择。特殊情况发生在用户退格、删除或在字符串中间输入时。通过子类化组合框编辑控件的窗口过程,我拦截任何WM_CHARWM_KEYDOWN消息,检查用户是否按下了退格键或删除键。如果是,则自动完成功能将被禁用,直到下一个击键。CBN_EDITCHANGE处理程序中的(dwStartSel == nTextLen)检查确保用户不是在字符串中间输入。

    由于这是一个纯ATL项目,因此没有任何方便的MFC包装类(CComboBoxCStatic)可用,因此所有与这些控件的通信都通过低级SendMessage调用完成。一旦习惯了,这也不是太糟糕。

    构建版本和注册

    您需要在项目中考虑几个构建配置
    • bin\ReleaseUMinDependency\ - Unicode
    • bin\DebugU\ - Unicode
    • bin\ReleaseMinDependency\
    • bin\ReleaseMinSize\
    • bin\Debug\
    • bin\ReleaseUMinSize\ - Unicode

    要注册该文件,只需选择DLL的适当版本(请记住,Unicode构建在Win95/98上无法正常工作),将其复制到合适的位置(建议使用Windows系统目录),然后从命令行运行“RegSvr32 CmdLineExt.dll”。现在,当您右键单击可执行文件时,“Run with Parameters”项将出现!

  • © . All rights reserved.