private FVM GetCurrentViewMode() { IShellView shellView = null; try { if (0 == shellBrowser.QueryActiveShellView(out shellView)) { IFolderView folderView = shellView as IFolderView; if (folderView != null) { FVM currentMode = 0; folderView.GetCurrentViewMode(ref currentMode); return(currentMode); } } } catch { } finally { if (shellView != null) { Marshal.ReleaseComObject(shellView); } } return(FVM.ICON); }
private void fvmw_ViewModeChanged(object sender, EventArgs e) { IShellView shellView = null; try { if (0 == shellBrowser.QueryActiveShellView(out shellView)) { IFolderView folderView = shellView as IFolderView; if (folderView != null) { FVM currentMode = 0; folderView.GetCurrentViewMode(ref currentMode); FVM mode = fvmw.ViewMode; if (currentMode != mode) { folderView.SetCurrentViewMode(mode); UpdateButtonImage(mode); } } } } catch { } finally { if (shellView != null) { Marshal.ReleaseComObject(shellView); } } }
private static IDLWrapper GetShellPath(IFolderView folderView) { if (folderView == null) { return(null); } IPersistFolder2 ppv = null; try { Guid riid = ExplorerGUIDs.IID_IPersistFolder2; if (folderView.GetFolder(ref riid, out ppv) == 0) { IntPtr ptr; ppv.GetCurFolder(out ptr); return(new IDLWrapper(ptr)); } } catch { } finally { if (ppv != null) { Marshal.ReleaseComObject(ppv); } } return(new IDLWrapper(IntPtr.Zero)); }
static void Main(string[] args) { var shellWindows = new ShellWindows(); foreach (IWebBrowser2 win in shellWindows) { IServiceProvider sp = win as IServiceProvider; object sb; sp.QueryService(SID_STopLevelBrowser, typeof(IShellBrowser).GUID, out sb); IShellBrowser shellBrowser = (IShellBrowser)sb; object sv; shellBrowser.QueryActiveShellView(out sv); Console.WriteLine(win.LocationURL + " " + win.LocationName); IFolderView fv = sv as IFolderView; if (fv != null) { // only folder implementation support this (IE windows do not for example) object pf; fv.GetFolder(typeof(IPersistFolder2).GUID, out pf); IPersistFolder2 persistFolder = (IPersistFolder2)pf; // get folder class, for example // CLSID_ShellFSFolder for standard explorer folders Guid clsid; persistFolder.GetClassID(out clsid); Console.WriteLine(" clsid:" + clsid); // get current folder pidl IntPtr pidl; persistFolder.GetCurFolder(out pidl); // TODO: do something with pidl Marshal.FreeCoTaskMem(pidl); // free pidl's allocated memory } } }
public static IntPtr ShellGetPath(IShellBrowser shellBrowser) { IShellView ppshv = null; IPersistFolder2 ppv = null; try { if (shellBrowser.QueryActiveShellView(out ppshv) == 0) { Guid riid = ExplorerGUIDs.IID_IPersistFolder2; IFolderView view2 = (IFolderView)ppshv; if (view2.GetFolder(ref riid, out ppv) == 0) { IntPtr ptr; ppv.GetCurFolder(out ptr); return(ptr); } } } catch { } finally { if (ppshv != null) { Marshal.ReleaseComObject(ppshv); } if (ppv != null) { Marshal.ReleaseComObject(ppv); } } return(IntPtr.Zero); }
public void Dispose() { if (FolderView != null) { Marshal.ReleaseComObject(FolderView); FolderView = null; } }
public FolderScanner(FolderQueue fq, IFolderView fv) { this.fq = fq; this.fv = fv; Thread t = new Thread(Runner); t.Priority = ThreadPriority.Lowest; t.Start(); }
public void Dispose() { if(shellBrowser != null) { Marshal.FinalReleaseComObject(shellBrowser); shellBrowser = null; } if(folderView != null) { Marshal.ReleaseComObject(folderView); folderView = null; } }
private static void AddCommandLineToTab(ITab tab) { IFolderView FolderView = tab as IFolderView; if (FolderView != null) { CommandLinePanel CmdLinePanel = new CommandLinePanel(); CmdLinePanel.MaxCommandLength = _MaxCommandLength; CmdLinePanel.HistoryDepth = _HistoryDepth; tab.DockControl(DockStyle.Bottom, CmdLinePanel); FolderView.CurrentFolderChanged += (sender2, e2) => CmdLinePanel.CurrentFolder = FolderView.CurrentFolder; } }
void Test() { ShellWindows shellWindows = new ShellWindows(); try { foreach (IWebBrowser2 win in shellWindows) { WinAPI.IServiceProvider sp = win as WinAPI.IServiceProvider; object sb; sp.QueryService(SID_STopLevelBrowser, typeof(IShellBrowser).GUID, out sb); IShellBrowser shellBrowser = (IShellBrowser)sb; IShellView sv; shellBrowser.QueryActiveShellView(out sv); Console.WriteLine(win.LocationURL + " " + win.LocationName); IFolderView fv = sv as IFolderView; if (fv != null) { Timer t = new Timer(); t.Interval = 200; t.Tick += (o, se) => { int fitem; if (0 == fv.GetFocusedItem(out fitem)) { IntPtr pid; if (0 == fv.Item(fitem, out pid)) { //invokea(pid); } Marshal.FreeHGlobal(pid); } }; t.Start(); } } } catch (Exception ex) { Console.WriteLine(ex); } finally { if (shellWindows != null) { Marshal.ReleaseComObject(shellWindows); } } }
public void Dispose() { if (shellBrowser != null) { Marshal.FinalReleaseComObject(shellBrowser); shellBrowser = null; } if (folderView != null) { Marshal.ReleaseComObject(folderView); folderView = null; } }
private FVWrapper GetFolderView() { IShellView ppshv; if (shellBrowser.QueryActiveShellView(out ppshv) == 0) { IFolderView view = ppshv as IFolderView; if (view != null) { return(new FVWrapper(view)); } } return(null); }
public void ShellTest() { var shellWindows = new ShellWindows(); foreach (IWebBrowser2 win in shellWindows) { IServiceProvider sp = win as IServiceProvider; object sb; sp.QueryService(SID_STopLevelBrowser, typeof(IShellBrowser).GUID, out sb); IShellBrowser shellBrowser = (IShellBrowser)sb; object sv; shellBrowser.QueryActiveShellView(out sv); Console.WriteLine(win.LocationURL + " " + win.LocationName); IFolderView fv = sv as IFolderView; if (fv != null) { // only folder implementation support this (IE windows do not for example) object pf; fv.GetFolder(typeof(IPersistFolder2).GUID, out pf); IPersistFolder2 persistFolder = (IPersistFolder2)pf; // get folder class, for example // CLSID_ShellFSFolder for standard explorer folders Guid clsid; persistFolder.GetClassID(out clsid); Console.WriteLine(" clsid:" + clsid); int pitem; Timer timer = new Timer(new TimerCallback(stat => { //if (0 == fv.GetFocusedItem(out pitem)) //{ // Console.WriteLine(pitem); //} if (0 == fv.ItemCount(0x00000001, out pitem)) { Console.WriteLine(pitem); } })); timer.Change(200, 0); // get current folder pidl IntPtr pidl; persistFolder.GetCurFolder(out pidl); // TODO: do something with pidl Marshal.FreeCoTaskMem(pidl); // free pidl's allocated memory } } }
// Call this on navigate to refresh the FolderView public void OnNavigateComplete() { if (shellBrowser == null) { return; } if (folderView != null) { Marshal.ReleaseComObject(folderView); folderView = null; } IShellView ppshv; if (shellBrowser.QueryActiveShellView(out ppshv) == 0) { folderView = ppshv as IFolderView; } }
public static TInterface GetFolder <TInterface>(this IFolderView folderView) { folderView.GetFolder(typeof(TInterface).GUID, out var ppv); return((TInterface)ppv); }
public FVWrapper(IFolderView folderView) { FolderView = folderView; }
public static int GetFocusedItem(this IFolderView folderView) { folderView.GetFocusedItem(out var piItem); return(piItem); }
public static IntPtr Item(this IFolderView folderView, int index) { folderView.Item(index, out var pidl); return(pidl); }
private static IDLWrapper GetShellPath(IFolderView folderView) { if(folderView == null) return null; IPersistFolder2 ppv = null; try { Guid riid = ExplorerGUIDs.IID_IPersistFolder2; if(folderView.GetFolder(ref riid, out ppv) == 0) { IntPtr ptr; ppv.GetCurFolder(out ptr); return new IDLWrapper(ptr); } } catch { } finally { if(ppv != null) { Marshal.ReleaseComObject(ppv); } } return new IDLWrapper(IntPtr.Zero); }
private bool GetFolderView() { IntPtr pUnk = PInvoke.SendMessage(GetProgmanHWnd(), 0x407, IntPtr.Zero, IntPtr.Zero); if(pUnk != IntPtr.Zero) { try { IShellView view; this.shellBrowser = (IShellBrowser)Marshal.GetObjectForIUnknown(pUnk); if(this.shellBrowser.QueryActiveShellView(out view) == 0) { this.folderView = view as IFolderView; if(this.folderView != null) { return true; } } } catch { } finally { Marshal.Release(pUnk); } } return false; }
public override void CloseDW(uint dwReserved) { if(iContextMenu2 != null) { Marshal.ReleaseComObject(iContextMenu2); iContextMenu2 = null; } if(this.folderView != null) { Marshal.ReleaseComObject(this.folderView); this.folderView = null; } if(this.shellBrowser != null) { Marshal.ReleaseComObject(this.shellBrowser); this.shellBrowser = null; } DisposeInvoker method = new DisposeInvoker(this.InvokeDispose); if(this.thumbnailTooltip != null) { this.thumbnailTooltip.Invoke(method, new object[] { this.thumbnailTooltip }); this.thumbnailTooltip = null; } if(this.subDirTip != null) { this.subDirTip.Invoke(method, new object[] { this.subDirTip }); this.subDirTip = null; } if(this.hashForm != null) { this.hashForm.Invoke(method, new object[] { this.hashForm }); this.hashForm = null; } if(this.hHook_MsgDesktop != IntPtr.Zero) { PInvoke.UnhookWindowsHookEx(this.hHook_MsgDesktop); this.hHook_MsgDesktop = IntPtr.Zero; } if(this.hHook_MsgShell_TrayWnd != IntPtr.Zero) { PInvoke.UnhookWindowsHookEx(this.hHook_MsgShell_TrayWnd); this.hHook_MsgShell_TrayWnd = IntPtr.Zero; } if(this.hHook_KeyDesktop != IntPtr.Zero) { PInvoke.UnhookWindowsHookEx(this.hHook_KeyDesktop); this.hHook_KeyDesktop = IntPtr.Zero; } if(this.shellViewController != null) { this.shellViewController.ReleaseHandle(); this.shellViewController = null; } base.CloseDW(dwReserved); }
// Call this on navigate to refresh the FolderView public void OnNavigateComplete() { if(shellBrowser == null) return; if(folderView != null) { Marshal.ReleaseComObject(folderView); folderView = null; } IShellView ppshv; if(shellBrowser.QueryActiveShellView(out ppshv) == 0) { folderView = ppshv as IFolderView; } }
/// <summary> /// Open folder and select an item. /// </summary> /// <remarks> /// SHParseDisplayName will not always find the correct folder. If the user has a folder open that is rooted in their user folder (e.g. the desktop, Dropbox/Mega/Nextcloud folder), /// this won't match the folder reference returned by SHParseDisplayName if given the actual path of the same folder. This will result in opening a duplicate folder. /// So instead, we iterate through open folder windows for a path match first, then use the old method if one is not found. /// </remarks> /// <param name="filePath">Full path to a file to highlight in Windows Explorer</param> public static void OpenFolderAndSelectItem(string filePath) { var folderPath = Path.GetDirectoryName(filePath); bool opened = false; var shellWindowsType = Type.GetTypeFromCLSID(SID_ShellWindows); var shellWindows = (dynamic)Activator.CreateInstance(shellWindowsType); try { foreach (IServiceProvider sp in shellWindows) { var pidl = IntPtr.Zero; var nativeFile = IntPtr.Zero; try { sp.QueryService(SID_STopLevelBrowser, typeof(IShellBrowser).GUID, out object sb); IShellBrowser shellBrowser = (IShellBrowser)sb; shellBrowser.QueryActiveShellView(out object sv); IFolderView fv = sv as IFolderView; if (fv != null) { // only folder implementation support this (IE windows do not for example) fv.GetFolder(typeof(IPersistFolder2).GUID, out object pf); IPersistFolder2 persistFolder = (IPersistFolder2)pf; // get current folder pidl persistFolder.GetCurFolder(out pidl); var path = new StringBuilder(1024); if (SHGetPathFromIDList(pidl, path)) { if (string.Equals(path.ToString(), folderPath, StringComparison.InvariantCultureIgnoreCase)) { SHParseDisplayName(Path.Combine(folderPath, filePath), IntPtr.Zero, out nativeFile, 0, out _); IntPtr[] fileArray; if (nativeFile == IntPtr.Zero) { // Open the folder without the file selected if we can't find the file fileArray = new IntPtr[0]; } else { fileArray = new IntPtr[] { nativeFile }; } SHOpenFolderAndSelectItems(pidl, (uint)fileArray.Length, fileArray, 0); opened = true; break; } } } } finally { if (nativeFile != IntPtr.Zero) { Marshal.FreeCoTaskMem(nativeFile); } if (pidl != IntPtr.Zero) { Marshal.FreeCoTaskMem(pidl); } Marshal.ReleaseComObject(sp); } } } finally { Marshal.FinalReleaseComObject(shellWindows); } if (!opened) { IntPtr nativeFolder; uint psfgaoOut; SHParseDisplayName(folderPath, IntPtr.Zero, out nativeFolder, 0, out psfgaoOut); if (nativeFolder == IntPtr.Zero) { // Log error, can't find folder return; } IntPtr nativeFile; SHParseDisplayName(Path.Combine(folderPath, filePath), IntPtr.Zero, out nativeFile, 0, out psfgaoOut); IntPtr[] fileArray; if (nativeFile == IntPtr.Zero) { // Open the folder without the file selected if we can't find the file fileArray = new IntPtr[0]; } else { fileArray = new IntPtr[] { nativeFile }; } SHOpenFolderAndSelectItems(nativeFolder, (uint)fileArray.Length, fileArray, 0); Marshal.FreeCoTaskMem(nativeFolder); if (nativeFile != IntPtr.Zero) { Marshal.FreeCoTaskMem(nativeFile); } } }
public void Dispose() { if(FolderView != null) { Marshal.ReleaseComObject(FolderView); FolderView = null; } }