Windows var filesToSelectIntPtrs=newintptr[filesToSelect.Length]; for(int i=0;i

Windows var filesToSelectIntPtrs=newintptr[filesToSelect.Length]; for(int i=0;i,windows,explorer,windows-shell,Windows,Explorer,Windows Shell,有COM Automation和绑定IDispatch接口,这些接口在PowerShell、Visual Basic.NET和C#中易于使用,一些示例代码: $shell = New-Object -ComObject Shell.Application function SelectFiles($filesToSelect) { foreach ($fileToSelect in $filesToSelect) { foreach ($window in $s

有COM Automation和绑定IDispatch接口,这些接口在PowerShell、Visual Basic.NET和C#中易于使用,一些示例代码:

$shell = New-Object -ComObject Shell.Application

function SelectFiles($filesToSelect)
{
    foreach ($fileToSelect in $filesToSelect)
    {
        foreach ($window in $shell.Windows())
        {
            foreach ($folderItem in $window.Document.Folder.Items())
            {
                if ($folderItem.Path -eq $fileToSelect)
                {
                    $window.Document.SelectItem($folderItem, 1 + 8)
                }
            }
        }
    }
}
-


将“在windows中显示此文件”替换为“在windows文件夹中显示”(“windows”在此处是可选的)--问题已解决。@J.F.Sebastian抱歉。。。你能解释一下吗。我不明白这是怎么解决猎户座矮人的问题的。。。tia@flakdineno:我的意思是(作为一个低级选项),您可以只打开包含文件的父文件夹(而不选择文件)。显示如何打开文件夹并选择文件。啊,我知道了。你没有因为我只是要求你多解释一点而对我投反对票吧?如果这些文件不是互相跟踪的话,那就不好用了?这就是为什么我说“依赖”和“可能能够”。“自动热键”中有很多选项,包括自动搜索,我只是举了一个例子。我不知道为什么会被标记下来。当您需要做一些使用现有API无法完成的事情时,AutoHotkey是一个极好的解决方案。它有许多保障措施,可以用来确保正确的计划是有针对性的。有很多可能性。标记为答案的答案不是答案。这只是一个显而易见的陈述,这也是问题被问到的原因。我建议任何记下这个答案的人都应该首先查看AutoHotkey并了解它能做什么。“它应该内置在windows中。”bruceatk同意。投票通过。拉特姆。可能有人太迂腐了,说SO不喜欢你用库建议解决问题,但这种类型的答案(具体关于上下文、示例代码以及限制和力量的解释)完全在范围之内,并且适用于手头的问题。有关使用此方法的任何更多信息都会有所帮助。。。pinvoke.net上似乎没有什么东西,我对interop也不太在行。值得注意的是:selection/count变量看起来不像,但它们的末尾包含一个0分隔符。如果没有它,SHOpenFolderAndSelectItems函数无法选择所有请求的文件(这意味着在calloc()的情况下,传递项目数+1)。如果您不想自己创建程序,可以使用我使用stack overflow中的答案编写的工具:。检查源代码,自由修改,或者只使用编译的exe文件和安装说明。右键单击要选择的文件列表,点击选择文件,就这样。你记得你搜索了哪些页面吗?这两个链接现在都过时了。你怎么知道?
F12:: 
 run explorer.exe /select`, "c:\path\to\file.txt"
 SendInput {Shift Down}{Down}{Down}{Shift Up}
return
//Directory to open
ITEMIDLIST *dir = ILCreateFromPath(_T("C:\\"));

//Items in directory to select
ITEMIDLIST *item1 = ILCreateFromPath(_T("C:\\Program Files\\"));
ITEMIDLIST *item2 = ILCreateFromPath(_T("C:\\Windows\\"));
const ITEMIDLIST* selection[] = {item1,item2};
UINT count = sizeof(selection) / sizeof(ITEMIDLIST);

//Perform selection
SHOpenFolderAndSelectItems(dir, count, selection, 0);

//Free resources
ILFree(dir);
ILFree(item1);
ILFree(item2);
static class NativeMethods
{
    [DllImport("shell32.dll", ExactSpelling = true)]
    public static extern int SHOpenFolderAndSelectItems(
        IntPtr pidlFolder,
        uint cidl,
        [In, MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl,
        uint dwFlags);

    [DllImport("shell32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr ILCreateFromPath([MarshalAs(UnmanagedType.LPTStr)] string pszPath);

    [ComImport]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("000214F9-0000-0000-C000-000000000046")]
    public interface IShellLinkW
    {
        [PreserveSig]
        int GetPath(StringBuilder pszFile, int cch, [In, Out] ref WIN32_FIND_DATAW pfd, uint fFlags);

        [PreserveSig]
        int GetIDList([Out] out IntPtr ppidl);

        [PreserveSig]
        int SetIDList([In] ref IntPtr pidl);

        [PreserveSig]
        int GetDescription(StringBuilder pszName, int cch);

        [PreserveSig]
        int SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);

        [PreserveSig]
        int GetWorkingDirectory(StringBuilder pszDir, int cch);

        [PreserveSig]
        int SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);

        [PreserveSig]
        int GetArguments(StringBuilder pszArgs, int cch);

        [PreserveSig]
        int SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);

        [PreserveSig]
        int GetHotkey([Out] out ushort pwHotkey);

        [PreserveSig]
        int SetHotkey(ushort wHotkey);

        [PreserveSig]
        int GetShowCmd([Out] out int piShowCmd);

        [PreserveSig]
        int SetShowCmd(int iShowCmd);

        [PreserveSig]
        int GetIconLocation(StringBuilder pszIconPath, int cch, [Out] out int piIcon);

        [PreserveSig]
        int SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);

        [PreserveSig]
        int SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, uint dwReserved);

        [PreserveSig]
        int Resolve(IntPtr hwnd, uint fFlags);

        [PreserveSig]
        int SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
    }

    [Serializable, StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode), BestFitMapping(false)]
    public struct WIN32_FIND_DATAW
    {
        public uint dwFileAttributes;
        public FILETIME ftCreationTime;
        public FILETIME ftLastAccessTime;
        public FILETIME ftLastWriteTime;
        public uint nFileSizeHigh;
        public uint nFileSizeLow;
        public uint dwReserved0;
        public uint dwReserved1;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string cFileName;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
        public string cAlternateFileName;
    }

    public static void OpenFolderAndSelectFiles(string folder, params string[] filesToSelect)
    {
        IntPtr dir = ILCreateFromPath(folder);

        var filesToSelectIntPtrs = new IntPtr[filesToSelect.Length];
        for (int i = 0; i < filesToSelect.Length; i++)
        {
            filesToSelectIntPtrs[i] = ILCreateFromPath(filesToSelect[i]);
        }

        SHOpenFolderAndSelectItems(dir, (uint) filesToSelect.Length, filesToSelectIntPtrs, 0);
        ReleaseComObject(dir);
        ReleaseComObject(filesToSelectIntPtrs);
    }

    private static void ReleaseComObject(params object[] comObjs)
    {
        foreach (object obj in comObjs)
        {
            if (obj != null && Marshal.IsComObject(obj))
                Marshal.ReleaseComObject(obj);
        }
    }
}
$shell = New-Object -ComObject Shell.Application

function SelectFiles($filesToSelect)
{
    foreach ($fileToSelect in $filesToSelect)
    {
        foreach ($window in $shell.Windows())
        {
            foreach ($folderItem in $window.Document.Folder.Items())
            {
                if ($folderItem.Path -eq $fileToSelect)
                {
                    $window.Document.SelectItem($folderItem, 1 + 8)
                }
            }
        }
    }
}
Option Strict Off

Imports Microsoft.VisualBasic

Public Class ExplorerHelp
    Shared ShellApp As Object = CreateObject("Shell.Application")

    Shared Sub SelectFile(filepath As String)
        For Each i In ShellApp.Windows
            For Each i2 In i.Document.Folder.Items()
                If i2.Path = filepath Then
                    i.Document.SelectItem(i2, 1 + 8)
                    Exit Sub
                End If
            Next
        Next
    End Sub
End Class