문제

다음과 같이 Windows 탐색기에서 단일 파일을 표시하고 선택할 수 있습니다.

explorer.exe /select, "c:\path\to\file.txt"

그러나 둘 이상의 파일을 선택하는 방법을 알아낼 수 없습니다.내가 시도한 선택의 순열 중 어느 것도 작동하지 않았습니다.

메모:나는 문서를 찾기 위해 이 페이지를 보았으나 도움이 되지 않았습니다.

https://support.microsoft.com/kb/314853
http://www.infocellar.com/Win98/explorer-switches.htm

도움이 되었습니까?

해결책

이것은 쉘 기능으로 가능해야합니다 SHOpenFolderAndSelectItems

편집하다

다음은 오류 검사 없이 C/C++에서 함수를 사용하는 방법을 보여주는 몇 가지 샘플 코드입니다.

//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);
        }
    }
}

Explorer.exe를 통해서는 수행할 수 없습니다.

실제로 달성하려는 것이 무엇인지에 따라 다음을 사용하여 수행할 수 있습니다. 오토핫키.일반적으로 수행할 수 없는 작업을 자동화할 수 있는 놀라운 무료 도구입니다.Windows와 함께 제공되어야 합니다.이 스크립트는 파일을 선택하고 F12를 누르면 그 아래에 있는 다음 두 파일을 강조 표시합니다.

F12:: 
 run explorer.exe /select`, "c:\path\to\file.txt"
 SendInput {Shift Down}{Down}{Down}{Shift Up}
return

텍스트 파일에 중간 두 줄을 넣은 다음 이를 autohotkey.exe에 parm으로 전달할 수도 있습니다.스크립트를 컴파일하여 호출할 수 있는 독립 실행형 exe로 만드는 옵션도 있습니다.훌륭한 도움말 파일과 함께 훌륭하게 작동합니다.

@Orion, C#에서 자동 핫키를 사용할 수 있습니다.자동 핫키 스크립트를 C# 앱에서 시작할 수 있는 독립형 실행 파일(약 400k)로 만들 수 있습니다(탐색기를 시작하는 방식과 동일).명령줄 매개변수를 전달할 수도 있습니다.런타임 요구 사항이 없습니다.

이는 달성하려는 목표와 더 나은 방법이 있는지 고려하는 것이 좋은 질문 중 하나입니다.

더 많은 컨텍스트를 추가하기 위해 - 우리 회사는 C# 클라이언트 애플리케이션을 개발하여 사용자가 파일을로드하고 그와 함께 작업을 수행 할 수 있습니다. iTunes가 디스크에 실제 파일을 표시하지 않고 MP3 파일을 관리하는 것과 같습니다.

응용 프로그램에서 파일을 선택하고 'Windows 탐색기에 이 파일 표시' 명령을 수행하는 것이 유용합니다. 이것이 제가 달성하려는 목표이며 단일 파일에 대해 그렇게 했습니다.

우리는 사용자가 애플리케이션 내에서 여러 파일을 선택하고 이동/삭제 등을 할 수 있는 ListView를 가지고 있습니다.선택한 여러 파일에 대해 'Windows에서 이 파일 표시' 명령이 작동하도록 하는 것이 좋을 것입니다. 적어도 모든 소스 파일이 동일한 디렉토리에 있는 경우에는 가능하지만 가능하지 않은 경우에는 주요 기능이 아닙니다.

사용하시면 될 것 같아요 FindWindowEx Windows 탐색기의 SysListView32를 얻으려면 다음을 사용하십시오. SendMessage ~와 함께 LVM_SETITEMSTATE 항목을 선택합니다.물건의 위치를 ​​알기가 어렵네요...아마도 LVM_FINDITEM 이를 위해 사용될 수 있습니다.

그르르 나도 이런 걸 하고 싶어.Media Player는 2개 이상의 파일을 선택하고 마우스 오른쪽 버튼을 클릭하고 "파일 위치 열기"를 수행할 때 이 작업을 수행하지만 정확히 어떻게 해야 하는지는 모릅니다(또한 그것을 알아내기 위해 procmon에 시간을 소비하고 싶지도 않습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top