Get selected folder items using WinAPI

Hi guys, I'm trying to get the selected files in the folder that the user is using. I have the following code that is already running, but only on the desktop:

private string selectedFiles() { // get the handle of the desktop listview IntPtr vHandle = WinApiWrapper.FindWindow("Progman", "Program Manager"); vHandle = WinApiWrapper.FindWindowEx(vHandle, IntPtr.Zero, "SHELLDLL_DefView", null); vHandle = WinApiWrapper.FindWindowEx(vHandle, IntPtr.Zero, "SysListView32", "FolderView"); //IntPtr vHandle = WinApiWrapper.GetForegroundWindow(); //Get total count of the icons on the desktop int vItemCount = WinApiWrapper.SendMessage(vHandle, WinApiWrapper.LVM_GETITEMCOUNT, 0, 0); //MessageBox.Show(vItemCount.ToString()); uint vProcessId; WinApiWrapper.GetWindowThreadProcessId(vHandle, out vProcessId); IntPtr vProcess = WinApiWrapper.OpenProcess(WinApiWrapper.PROCESS_VM_OPERATION | WinApiWrapper.PROCESS_VM_READ | WinApiWrapper.PROCESS_VM_WRITE, false, vProcessId); IntPtr vPointer = WinApiWrapper.VirtualAllocEx(vProcess, IntPtr.Zero, 4096, WinApiWrapper.MEM_RESERVE | WinApiWrapper.MEM_COMMIT, WinApiWrapper.PAGE_READWRITE); try { for (int j = 0; j < vItemCount; j++) { byte[] vBuffer = new byte[256]; WinApiWrapper.LVITEM[] vItem = new WinApiWrapper.LVITEM[1]; vItem[0].mask = WinApiWrapper.LVIF_TEXT; vItem[0].iItem = j; vItem[0].iSubItem = 0; vItem[0].cchTextMax = vBuffer.Length; vItem[0].pszText = (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(WinApiWrapper.LVITEM))); uint vNumberOfBytesRead = 0; WinApiWrapper.WriteProcessMemory(vProcess, vPointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0), Marshal.SizeOf(typeof(WinApiWrapper.LVITEM)), ref vNumberOfBytesRead); WinApiWrapper.SendMessage(vHandle, WinApiWrapper.LVM_GETITEMW, j, vPointer.ToInt32()); WinApiWrapper.ReadProcessMemory(vProcess, (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(WinApiWrapper.LVITEM))), Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), vBuffer.Length, ref vNumberOfBytesRead); string vText = Encoding.Unicode.GetString(vBuffer, 0, (int)vNumberOfBytesRead); string IconName = vText; //Check if item is selected var result = WinApiWrapper.SendMessage(vHandle, WinApiWrapper.LVM_GETITEMSTATE, j, (int)WinApiWrapper.LVIS_SELECTED); if (result == WinApiWrapper.LVIS_SELECTED) { return vText; } } } finally { WinApiWrapper.VirtualFreeEx(vProcess, vPointer, 0, WinApiWrapper.MEM_RELEASE); WinApiWrapper.CloseHandle(vProcess); } return String.Empty; } 

I tried to get the window handle using GetForegroundWindow () and then call SHELLDLL_DefView without success.

So, how can I change the first 3 lines to get me a handle to the current folder?

+5
c # windows winapi windows-explorer
source share
2 answers

This is a lot of hacking to do something that is explicitly supported by various objects and shell interfaces. The documentation provided does not make it easy to detect, but functionality exists. Raymond Chen wrote an excellent article about using these interfaces. There seems to be no way to get the “current” folder, although I think you could get HWND and see if there is a foreground window.

+4
source share

Thank you very much. You gave me the right direction. You can get the selected files in the folder:

 /// <summary> /// Get the selected file of the active window /// </summary> /// <param name="handle">Handle of active window</param> /// <returns></returns> public String getSelectedFileOfActiveWindow(Int32 handle) { try { // Required ref: SHDocVw (Microsoft Internet Controls COM Object) ShellWindows shellWindows = new SHDocVw.ShellWindows(); foreach (InternetExplorer window in shellWindows) { if (window.HWND == handle) return ((Shell32.IShellFolderViewDual2)window.Document).FocusedItem.Path; } } catch (Exception) { return null; } return null; } 
+2
source share

All Articles