嘿家伙,我尝试获取用户正在使用的文件夹的选定文件。 我有以下代码已经运行,但只在桌面文件上:
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; }
我试图用GetForegroundWindow()获取窗口句柄,然后调用SHELLDLL_DefView而没有成功。
那么我怎样才能改变前3行,让我使用当前文件夹的句柄?
这是很多黑客做的东西,明确支持各种外壳对象和接口。 授予文档不会让它容易发现,但功能在那里。 Raymond Chen 写了一篇关于使用这些接口的文章 。 似乎没有办法获得“当前”文件夹,但我想你可以得到的HWNDs,看看是否有任何前景窗口。
非常感谢你。 你给了我正确的方向。 可以获取文件夹的选定文件:
/// <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; }