Windows Shell Automation InvokeVerb 基于数字而不是命令字符串

本文关键字:字符串 命令 数字 Automation Shell InvokeVerb 于数字 Windows | 更新日期: 2023-09-27 18:31:10

通常外壳自动化 InvokeVerb 只接受字符串命令,基于下面的文档:https://msdn.microsoft.com/en-us/library/ms723189(v=vs.85).aspx

但是我注意到一个cmd行EXE实用程序,它接受一个数字http://www.technosys.net/products/utils/pintotaskbar

这很有趣,因为在 Windows 10 中,"&固定到任务栏"已从 shell 自动化中删除,尽管在 UI 中可见。( https://connect.microsoft.com/PowerShell/feedback/details/1609288/pin-to-taskbar-no-longer-working-in-windows-10 )

但是,此EXE在命令工作时传递"数字"5386。

我很想知道在PowerShell/VBScript/.NET语言或Win32 C/C++中可以使用什么方法来实现这一点。

我知道这几乎肯定是不受支持的,并且可能会随时中断,因为这些数字在操作系统版本之间发生了变化。

在 PowerShell 中使用字符串版本的示例

$filepath = "C:'windows'system32'notepad.exe"
$path = Split-Path $FilePath 
$shell= New-Object -com "Shell.Application"  
$folder=$shell.Namespace($path)    
$item = $folder.Parsename((split-path $FilePath -leaf)) 
$item.InvokeVerb("&Pin to taskbar")

Windows Shell Automation InvokeVerb 基于数字而不是命令字符串

底层 shell 上下文菜单扩展系统实际上本机使用数字 ID;字符串动词是顶部的可选层。但是,正如您所观察到的,命令 ID 是上下文菜单扩展的内部命令,并且不能保证在版本之间(甚至在调用之间)保持一致 - 动词的全部意义在于它们允许以编程方式调用命令,而不管它们的 ID 如何。

在 C/C++ 中,您可以通过将数字 ID 转换为字符串指针来按其 ID 调用命令(其基本原理是,由于所有有效的字符串指针都高于 65535,因此只要数字适合 16 位,将数字作为字符串指针传递是"安全的",因为接收 API 能够正确确定它是否是"真正的字符串")。

请注意,这与将数字打印为字符串不同,后者不正确。MAKEINTRESOURCE宏正是为此目的而存在的。

例如,ID 为 1234 的命令将使用 MAKEINTRESOURCE(1234) 作为动词进行调用。

这些天我在基于 Windows 脚本主机的脚本中遇到了同样的问题。

使用本地化字符串调用谓词不像以前那样工作。但是,您仍然可以获取项的"谓词"集合,然后枚举它们,直到获得要调用的谓词。然后,您可以使用它的"DoIt"方法调用它,而无需传递谓词名称。

在 WSH JScript 中,它看起来像这样:

    /* workaround for 'item.InvokeVerb("&Delete")' which no longer works */
    var verbs = item.Verbs(); // item == return of folder.ParseName(..)
    for (var x = 0; x < verbs.Count; x++)
    {
        var verb = verbs.Item(x);
        if (verb.Name == "&Delete") //replace with "&Pin to taskbar"
        {                   
            try
            {
                verb.DoIt();
                WSH.Echo ("Deleted:", item.Name);
            }
            catch(e)
            {
                WSH.Echo ("Error Deleting:", item.Name + "'r'n't", e.description, e.number);
            }
            break;
        }
    }
}

可能它也可以在PowerShell中以某种方式工作

ffr:

https://learn.microsoft.com/en-us/windows/win32/shell/folderitem-verbshttps://learn.microsoft.com/en-us/windows/win32/shell/folderitemverb