2013-09-30 5 views
8

Windows 바탕 화면과 탐색기 Windows에서 선택한 파일 목록을 가져 오려고합니다. 요구 사항은 활성 탐색기 창이나 바탕 화면에서 현재 선택 항목을 검색 할 수 있어야한다는 것입니다.Windows 바탕 화면에서 선택한 파일 목록 가져 오기

온라인 리소스를 살펴본 후 다음 코드를 함께 관리했지만 데스크톱에서 선택한 항목의 목록을 제공하지 않습니다.

ArrayList selected = new ArrayList(); 
var shell = new Shell32.Shell(); 
IntPtr handle = IntPtr.Zero; 
handle = GetForegroundWindow(); 
int intHandle = handle.ToInt32(); 

//For each explorer 
foreach (InternetExplorer window in new ShellWindowsClass()) 
{ 

    if (window.HWND == (int)handle) 
    { 
     Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems(); 
     foreach (Shell32.FolderItem item in items) 
     { 
      selected.Add(item.Path); 
     } 
    } 
} 

그 외에도 다음을 시도했지만 데스크톱을 무시하면서 열려있는 모든 탐색기 창에서 선택한 요소의 목록 만 제공합니다.

string filename; = Path.GetFileNameWithoutExtension(window.FullName).ToLower(); 
if (filename.ToLowerInvariant() == "explorer") 
{ 
    Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems(); 
    foreach (Shell32.FolderItem item in items) 
    { 
     //MessageBox.Show(item.Path.ToString()); 
     selected.Add(item.Path); 
    } 
} 

그래서 나는 항상 탐색기 창에서 목록으로 끝나고 탐색기 창이 열려 있지 않은 경우에도 결과를 얻지 못합니다. 현재의 기술은 데스크톱을 모두 무시하는 것처럼 보입니다.

누군가 현재의 활성 창/데스크탑에서 선택한 파일 목록을 얻으려면 나를 도울 수 있다면 정말 고맙겠습니다.

감사합니다.

+0

당신은 바탕 화면에 파일을 선택받을 수 있을까? 그렇다면 어떻게 할 수 있는지 말해 줄 수 있습니까? 부디! – GSP

답변

1

여전히 목록보기이기 때문에 데스크톱에서는 쉽지만 올바른 핸들을 찾으십시오. 목록보기는 데스크톱 핸들의 하위 항목입니다.

Desktop 
+- Progman (for backward compatibility) 
    +- Shell Def View 
     +- SysListView32 (even under 64 bit) 

그러면 목록보기에서 모든 listview 작업을 수행 할 수 있습니다. 다른 탐색 창에는 목록보기가 없습니다. 대신 많은 사람들에게 수수께끼 인 클래스 DirectUIHWND이있는 창을 사용합니다. 방금 그 수수께끼를 푸는 방법을 설명하는 게시물을 발견했습니다.

http://smartbear.com/forums?forumid=81&threadid=68427#68428

는 나는 그것이 도움이되기를 바랍니다.

0

저는 프로세스간에 의사 소통을해야한다고 생각합니다. 다음 주제가 도움이 될 것입니다.

다음은 데스크톱에서 아이콘을 가져 오는 예제입니다. 데스크탑 항목 목록과 현재 위치가 가져옵니다. http://social.msdn.microsoft.com/Forums/windows/en-US/d7df8a4d-fc0f-4b62-80c9-7768756456e6/how-can-i-get-desktops-icons-information-?forum=winforms

여기서 매개 변수 LVM_GETITEMSTATE는 위 링크의 샘플 코드에서 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/windows/desktop/bb761053(v=vs.85).aspx

행운을 빕니다 ..

1
using System.Runtime.InteropServices; 

    public class ShellItems 
    { 
     [StructLayoutAttribute(LayoutKind.Sequential)] 
     private struct LVITEM 
     { 
      public uint mask; 
      public int iItem; 
      public int iSubItem; 
      public uint state; 
      public uint stateMask; 
      public IntPtr pszText; 
      public int cchTextMax; 
      public int iImage; 
      public IntPtr lParam; 
     } 

     const int LVM_FIRST = 0x1000; 
     const int LVM_GETSELECTEDCOUNT = 4146; 
     const int LVM_GETNEXTITEM = LVM_FIRST + 12; 
     const int LVNI_SELECTED = 2; 
     const int LVM_GETITEMCOUNT = LVM_FIRST + 4; 
     const int LVM_GETITEM = LVM_FIRST + 75; 
     const int LVIF_TEXT = 0x0001; 

     [DllImport("user32.dll", EntryPoint = "GetShellWindow")] 
     public static extern System.IntPtr GetShellWindow(); 

     [DllImport("user32.dll", SetLastError = true)] 
     public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle); 

     [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)] 
     public static extern int SendMessagePtr(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); 

     [DllImport("User32.DLL")] 
     public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); 


     public int SelectedItemCount 
     { 
      get 
      { 
       return SendMessage(ShellListViewHandle, LVM_GETSELECTEDCOUNT, IntPtr.Zero.ToInt32(), IntPtr.Zero.ToInt32()); 
      } 
     } 
     public int Count 
     { 
      get 
      { 
       return SendMessage(ShellListViewHandle, LVM_GETITEMCOUNT, IntPtr.Zero.ToInt32(), IntPtr.Zero.ToInt32()); 
      } 
     } 
     public string GetItemText(int idx) 
     { 
      // Declare and populate the LVITEM structure 
      LVITEM lvi = new LVITEM(); 
      lvi.mask = LVIF_TEXT; 
      lvi.cchTextMax = 512; 
      lvi.iItem = idx;   // the zero-based index of the ListView item 
      lvi.iSubItem = 0;   // the one-based index of the subitem, or 0 if this 
      // structure refers to an item rather than a subitem 
      lvi.pszText = Marshal.AllocHGlobal(512); 

      // Send the LVM_GETITEM message to fill the LVITEM structure 
      IntPtr ptrLvi = Marshal.AllocHGlobal(Marshal.SizeOf(lvi)); 
      Marshal.StructureToPtr(lvi, ptrLvi, false); 
      try 
      { 
       SendMessagePtr(ShellListViewHandle, LVM_GETITEM, IntPtr.Zero, ptrLvi); 
      } 
      catch (Exception ex) 
      { 
       System.Diagnostics.Debug.WriteLine(ex.Message); 
      } 

      // Extract the text of the specified item 
      string itemText = Marshal.PtrToStringAuto(lvi.pszText); 
      return itemText; 
     } 

     IntPtr ShellListViewHandle 
     { 
      get 
      { 
       IntPtr _ProgMan = GetShellWindow(); 
       IntPtr _SHELLDLL_DefViewParent = _ProgMan; 
       IntPtr _SHELLDLL_DefView = FindWindowEx(_ProgMan, IntPtr.Zero, "SHELLDLL_DefView", null); 
       IntPtr _SysListView32 = FindWindowEx(_SHELLDLL_DefView, IntPtr.Zero, "SysListView32", "FolderView"); 
       return _SysListView32; 
      } 
     } 

     public int GetSelectedItemIndex(int iPos = -1) 
     { 
      return SendMessage(ShellListViewHandle, LVM_GETNEXTITEM, iPos, LVNI_SELECTED); 
     } 
    } 
+1

항목 수와 선택한 항목 수를 반환하지만 GetItemText에서 충돌이 발생합니까? –