HResult IShellBrowser.BrowseObject(IntPtr pidl, SBSP wFlags) { IntPtr result = IntPtr.Zero; if ((wFlags & SBSP.SBSP_RELATIVE) != 0) { ShellItem child = new ShellItem(m_ShellView.CurrentFolder, pidl); } else if ((wFlags & SBSP.SBSP_PARENT) != 0) { m_ShellView.NavigateParent(); } else if ((wFlags & SBSP.SBSP_NAVIGATEBACK) != 0) { m_ShellView.NavigateBack(); } else if ((wFlags & SBSP.SBSP_NAVIGATEFORWARD) != 0) { m_ShellView.NavigateForward(); } else if ((wFlags & SBSP.SBSP_SAMEBROWSER) != 0) { ShellItem child = new ShellItem(pidl); m_ShellView.Navigate(child); //child.Dispose(); } else { m_ShellView.Navigate(new ShellItem(ShellItem.Desktop, Shell32.ILFindLastID(pidl))); } return(HResult.S_OK); }
HResult IShellBrowser.BrowseObject(IntPtr pidl, SBSP wFlags) { if ((wFlags & SBSP.SBSP_RELATIVE) != 0) { // ReSharper disable once UnusedVariable var shellItem = new ShellItem(MShellView.CurrentFolder, pidl); } else if ((wFlags & SBSP.SBSP_PARENT) != 0) { MShellView.NavigateParent(); } else if ((wFlags & SBSP.SBSP_NAVIGATEBACK) != 0) { MShellView.NavigateBack(); } else if ((wFlags & SBSP.SBSP_NAVIGATEFORWARD) != 0) { MShellView.NavigateForward(); } else { MShellView.Navigate(new ShellItem(ShellItem.Desktop, pidl)); } return(HResult.S_OK); }
//IShellBrowser. public int BrowseObject(IntPtr pidl, SBSP wFlags) { if (Form.InvokeRequired) { AutoResetEvent theEvent = new AutoResetEvent(false); int result = WinError.E_FAIL; Form.Invoke((Action)(() => { result = ((IShellBrowser)this).BrowseObject(pidl, wFlags); theEvent.Set(); })); theEvent.WaitOne(); return(result); } this.hWndListView = IntPtr.Zero; var hr = PidlFolderMethods.BrowseObject(this, pidl, wFlags); if (hWndListView != IntPtr.Zero) { ResizeListView(this.hWndListView); } AfterSelectPath(pidl); return(hr); }
HResult IShellBrowser.BrowseObject(IntPtr pidl, SBSP wFlags) { IntPtr result = IntPtr.Zero; if ((wFlags & SBSP.SBSP_RELATIVE) != 0) { ShellItem child = new ShellItem(m_ShellView.CurrentFolder, pidl); } else if ((wFlags & SBSP.SBSP_PARENT) != 0) { m_ShellView.NavigateParent(); } else if ((wFlags & SBSP.SBSP_NAVIGATEBACK) != 0) { m_ShellView.NavigateBack(); } else if ((wFlags & SBSP.SBSP_NAVIGATEFORWARD) != 0) { m_ShellView.NavigateForward(); } else { m_ShellView.Navigate(new ShellItem(ShellItem.Desktop, pidl)); } return HResult.S_OK; }
public int Navigate(IDLWrapper idlw, SBSP flags = SBSP.SAMEBROWSER) { if (idlw.Available && shellBrowser != null) { try { return(shellBrowser.BrowseObject(idlw.PIDL, flags)); } catch (COMException) { } } return(1); }
public static IShellFolder GetFolderImpl(this IntPtr pidl, ref PidlFolderData data, SBSP wFlags) { IShellFolder result = null; int hr = 0; IntPtr pidlTmp = IntPtr.Zero; var folderTmp = data.folderTmp; var currentAbsolutePidl = data.currentAbsolutePidl; var folderTmpPtr = data.folderTmpPtr; var currentFolder = data.currentFolder; IShellFolder desktopFolder = PidlFolderData.DesktopFolder; var desktopFolderPidl = PidlFolderData.DesktopFolderPidl; // Check to see if we have a desktop pidl, relative pidl or absolite pidl. if (Shell32.ILIsEqual(pidl, desktopFolderPidl)) { // The provided PIDL is the desktop folder. pidlTmp = Shell32.ILClone(desktopFolderPidl); folderTmp = desktopFolder; } else if ((wFlags & SBSP.SBSP_RELATIVE) != 0) { // SBSP_RELATIVE - pidl is relative from the current folder if ((hr = currentFolder.BindToObject(pidl, IntPtr.Zero, ref Shell32.IID_IShellFolder, out folderTmpPtr)) != WinError.S_OK) { return(result); // hr; } pidlTmp = Shell32.ILCombine(currentAbsolutePidl, pidl); folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr); } else { // SBSP_ABSOLUTE - pidl is an absolute pidl (relative from desktop) PidlClone pidlClone = PidlClone.Of(pidl); folderTmp = GetPidlCloneFolder(pidlClone); pidlTmp = pidlClone.Handle; } if (folderTmp == null) { Shell32.ILFree(pidlTmp); return(result); // WinError.E_FAIL; } result = folderTmp; return(result); }
public int Navigate(IDLWrapper idlw, SBSP flags = SBSP.SAMEBROWSER) { if(idlw.Available && shellBrowser != null) { try { return shellBrowser.BrowseObject(idlw.PIDL, flags); } catch(COMException) { } } return 1; }
int IShellBrowser.BrowseObject(IntPtr pidl, SBSP wFlags) { if (this.InvokeRequired) { AutoResetEvent theEvent = new AutoResetEvent(false); int result = WinError.E_FAIL; this.Invoke((Action)(() => { result = ((IShellBrowser)this).BrowseObject(pidl, wFlags); theEvent.Set(); })); theEvent.WaitOne(); return result; } int hr; IntPtr folderTmpPtr; IShellFolder folderTmp; IntPtr pidlTmp; // We'll need the shell folder GUID. var shellFolderGuid = typeof (IShellFolder).GUID; var shellViewGuid = typeof (IShellView).GUID; // Check to see if we have a desktop pidl, relative pidl or absolite pidl. if (Shell32.ILIsEqual(pidl, desktopFolderPidl)) { // The provided PIDL is the desktop folder. pidlTmp = Shell32.ILClone(desktopFolderPidl); folderTmp = desktopFolder; } else if ((wFlags & SBSP.SBSP_RELATIVE) != 0) { // SBSP_RELATIVE - pidl is relative from the current folder if ((hr = currentFolder.BindToObject(pidl, IntPtr.Zero, ref shellFolderGuid, out folderTmpPtr)) != WinError.S_OK) return hr; pidlTmp = Shell32.ILCombine(currentAbsolutePidl, pidl); folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr); } else { // SBSP_ABSOLUTE - pidl is an absolute pidl (relative from desktop) pidlTmp = Shell32.ILClone(pidl); if ((hr = desktopFolder.BindToObject(pidlTmp, IntPtr.Zero, ref shellFolderGuid, out folderTmpPtr)) != WinError.S_OK) return hr; folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr); } if (folderTmp == null) { Shell32.ILFree(pidlTmp); return WinError.E_FAIL; } // Check that we have a new pidl if (Shell32.ILIsEqual(pidlTmp, currentAbsolutePidl)) { Shell32.ILFree(pidlTmp); return WinError.S_OK; } currentFolder = folderTmp; FOLDERSETTINGS fs = new FOLDERSETTINGS(); IShellView lastIShellView = shellView; if (lastIShellView != null) lastIShellView.GetCurrentInfo(ref fs); // Copy the old folder settings else { fs = new FOLDERSETTINGS(); fs.fFlags = folderFlags; fs.ViewMode = folderViewMode; } // Create the IShellView IntPtr iShellViewPtr; hr = folderTmp.CreateViewObject(Handle, ref shellViewGuid, out iShellViewPtr); if (hr == WinError.S_OK) { shellView = (IShellView) Marshal.GetObjectForIUnknown(iShellViewPtr); hWndListView = IntPtr.Zero; RECT rc = new RECT(0, 0, ClientSize.Width, ClientSize.Height); int res; try { // Create the actual list view. res = shellView.CreateViewWindow( lastIShellView, ref fs, this, ref rc, ref hWndListView); } catch (COMException) { return WinError.E_FAIL; } if (res < 0) return WinError.E_FAIL; // Release the old IShellView if (lastIShellView != null) { lastIShellView.GetCurrentInfo(ref fs); lastIShellView.UIActivate(SVUIA_STATUS.SVUIA_DEACTIVATE); lastIShellView.DestroyViewWindow(); } // Set focus to the IShellView shellView.UIActivate(SVUIA_STATUS.SVUIA_ACTIVATE_FOCUS); currentAbsolutePidl = pidlTmp; } return WinError.S_OK; }
int IShellBrowser.BrowseObject(IntPtr pidl, SBSP wFlags) { if (this.InvokeRequired) { AutoResetEvent theEvent = new AutoResetEvent(false); int result = WinError.E_FAIL; this.Invoke((Action)(() => { result = ((IShellBrowser)this).BrowseObject(pidl, wFlags); theEvent.Set(); })); theEvent.WaitOne(); return(result); } int hr; IntPtr folderTmpPtr; IShellFolder folderTmp; IntPtr pidlTmp; // We'll need the shell folder GUID. var shellFolderGuid = typeof(IShellFolder).GUID; var shellViewGuid = typeof(IShellView).GUID; // Check to see if we have a desktop pidl, relative pidl or absolite pidl. if (Shell32.ILIsEqual(pidl, desktopFolderPidl)) { // The provided PIDL is the desktop folder. pidlTmp = Shell32.ILClone(desktopFolderPidl); folderTmp = desktopFolder; } else if ((wFlags & SBSP.SBSP_RELATIVE) != 0) { // SBSP_RELATIVE - pidl is relative from the current folder if ((hr = currentFolder.BindToObject(pidl, IntPtr.Zero, ref shellFolderGuid, out folderTmpPtr)) != WinError.S_OK) { return(hr); } pidlTmp = Shell32.ILCombine(currentAbsolutePidl, pidl); folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr); } else { // SBSP_ABSOLUTE - pidl is an absolute pidl (relative from desktop) pidlTmp = Shell32.ILClone(pidl); if ((hr = desktopFolder.BindToObject(pidlTmp, IntPtr.Zero, ref shellFolderGuid, out folderTmpPtr)) != WinError.S_OK) { return(hr); } folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr); } if (folderTmp == null) { Shell32.ILFree(pidlTmp); return(WinError.E_FAIL); } // Check that we have a new pidl if (Shell32.ILIsEqual(pidlTmp, currentAbsolutePidl)) { Shell32.ILFree(pidlTmp); return(WinError.S_OK); } currentFolder = folderTmp; FOLDERSETTINGS fs = new FOLDERSETTINGS(); IShellView lastIShellView = shellView; if (lastIShellView != null) { lastIShellView.GetCurrentInfo(ref fs); } // Copy the old folder settings else { fs = new FOLDERSETTINGS(); fs.fFlags = folderFlags; fs.ViewMode = folderViewMode; } // Create the IShellView IntPtr iShellViewPtr; hr = folderTmp.CreateViewObject(Handle, ref shellViewGuid, out iShellViewPtr); if (hr == WinError.S_OK) { shellView = (IShellView) Marshal.GetObjectForIUnknown(iShellViewPtr); hWndListView = IntPtr.Zero; RECT rc = new RECT(0, 0, ClientSize.Width, ClientSize.Height); int res; try { // Create the actual list view. res = shellView.CreateViewWindow(lastIShellView, ref fs, this, ref rc, ref hWndListView); } catch (COMException) { return(WinError.E_FAIL); } if (res < 0) { return(WinError.E_FAIL); } // Release the old IShellView if (lastIShellView != null) { lastIShellView.GetCurrentInfo(ref fs); lastIShellView.UIActivate(SVUIA_STATUS.SVUIA_DEACTIVATE); lastIShellView.DestroyViewWindow(); } // Set focus to the IShellView shellView.UIActivate(SVUIA_STATUS.SVUIA_ACTIVATE_FOCUS); currentAbsolutePidl = pidlTmp; } return(WinError.S_OK); }
static int ChangeFolder(ShellDebuggerModel model, IntPtr pidl, SBSP wFlags, IShellFolder folderTmp, IntPtr pidlTmp) { model.currentFolder = folderTmp; var Form = model.Form; FOLDERSETTINGS fs = new FOLDERSETTINGS(); IShellView lastIShellView = model.ShellView; IShellView2 lastIShellView2 = model.ShellView as IShellView2; if (lastIShellView != null) { lastIShellView.GetCurrentInfo(ref fs); } // Copy the old folder settings else { fs = new FOLDERSETTINGS(); fs.fFlags = ShellDebuggerModel.folderFlags; fs.ViewMode = ShellDebuggerModel.folderViewMode; } // Create the IShellView IntPtr iShellViewPtr; var shellViewGuid = typeof(IShellView).GUID; var hr = ShellObject.CreateViewObject(folderTmp, Form.Handle, ref shellViewGuid, out iShellViewPtr); if (hr != WinError.S_OK) { shellViewGuid = typeof(IShellView).GUID; hr = ShellObject.CreateViewObject(folderTmp, Form.Handle, ref shellViewGuid, out iShellViewPtr); } if (hr == WinError.S_OK) { model.ShellView = null; model.ShellView = (IShellView) // IShellView2 Marshal.GetObjectForIUnknown(iShellViewPtr); //if (model.ShellView == null) // model.ShellView = (IShellView) // Marshal.GetObjectForIUnknown(iShellViewPtr); // int CreateViewWindow2(SV2CVW2_PARAMS lpParams); var hWndListView = IntPtr.Zero; RECT rc = new RECT(0, 0, Form.ClientSize.Width, Form.ClientSize.Height); int res; model.lastViewPidl = IntPtr.Zero; var shellView = model.ShellView; try { // Create the actual list view. res = shellView.CreateViewWindow(lastIShellView, ref fs, model, ref rc, ref hWndListView); model.hWndListView = hWndListView; shellView.EnableModeless(true); } catch (COMException) { return(WinError.E_FAIL); } if (res < 0) { return(WinError.E_FAIL); } // Release the old IShellView if (lastIShellView != null) { lastIShellView.GetCurrentInfo(ref fs); lastIShellView.UIActivate(SVUIA_STATUS.SVUIA_DEACTIVATE); lastIShellView.DestroyViewWindow(); } // Set focus to the IShellView model.ShellView.UIActivate(SVUIA_STATUS.SVUIA_ACTIVATE_FOCUS); model.currentAbsolutePidl = pidlTmp; if (model.lastViewPidl != IntPtr.Zero) { // var lastItem = model.LastSelected; } //else //{ // // empty list //} } return(WinError.S_OK); }
public static int BrowseObject(this ShellDebuggerModel model, IntPtr pidl, SBSP wFlags) { int hr; IntPtr folderTmpPtr; IShellFolder folderTmp = null; IntPtr pidlTmp; // We'll need the shell folder GUID. var shellFolderGuid = typeof(IShellFolder).GUID; var desktopFolder = model.DesktopFolder; var currentFolder = model.currentFolder; var currentAbsolutePidl = model.currentAbsolutePidl; // Check to see if we have a desktop pidl, relative pidl or absolite pidl. if (Shell32.ILIsEqual(pidl, model.DesktopFolderPidl)) { // The provided PIDL is the desktop folder. pidlTmp = Shell32.ILClone(model.DesktopFolderPidl); folderTmp = model.DesktopFolder; } else if ((wFlags & SBSP.SBSP_RELATIVE) != 0) { // SBSP_RELATIVE - pidl is relative from the current folder if ((hr = currentFolder.BindToObject(pidl, IntPtr.Zero, shellFolderGuid, out folderTmpPtr)) != WinError.S_OK) { return(WinError.E_FAIL); } pidlTmp = Shell32.ILCombine(currentAbsolutePidl, pidl); folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr); } else { // SBSP_ABSOLUTE - pidl is an absolute pidl (relative from desktop) pidlTmp = Shell32.ILClone(pidl); if ((hr = desktopFolder.BindToObject(pidlTmp, IntPtr.Zero, shellFolderGuid, out folderTmpPtr)) != WinError.S_OK) { return(WinError.E_FAIL); } folderTmp = (IShellFolder)Marshal.GetObjectForIUnknown(folderTmpPtr); } if (folderTmp == null) { Shell32.ILFree(pidlTmp); return(WinError.E_FAIL); } // Check that we have a new pidl if (Shell32.ILIsEqual(pidlTmp, currentAbsolutePidl)) { Shell32.ILFree(pidlTmp); return(WinError.S_OK); } model.hWndListView = IntPtr.Zero; model.lastViewPidl = IntPtr.Zero; var ret = ChangeFolder(model, pidl, wFlags, folderTmp, pidlTmp); //var path = PidlManager.GetPidlDisplayName(pidlTmp); //if (path == "Control Panel" || model.lastViewPidl == IntPtr.Zero) //{ // IEnumIDList ppenumIDList = null; // var hr3 = folderTmp.EnumObjects(model.Form.Handle, // SHCONTF.SHCONTF_INCLUDEHIDDEN | SHCONTF.SHCONTF_INCLUDESUPERHIDDEN | SHCONTF.SHCONTF_NONFOLDERS, // | SHCONTF.SHCONTF_FOLDERS , // out ppenumIDList); // if (ppenumIDList == null) // if empty list // { // IntPtr iShellFolderPtr = IntPtr.Zero; // var guidFolder2 = typeof(IShellFolder2).GUID; // folderTmpPtr = IntPtr.Zero; // if ((hr = desktopFolder.BindToObject(pidlTmp, IntPtr.Zero, // ref guidFolder2, // shellFolderGuid, // out folderTmpPtr)) == WinError.S_OK) // { // folderTmp = (IShellFolder2)Marshal.GetObjectForIUnknown(folderTmpPtr); // var hr2 = ShellObject.CreateViewObject(folderTmp, model.Form.Handle, ref guidFolder2, out iShellFolderPtr); // } // if (iShellFolderPtr != IntPtr.Zero) // { // var ShellFolder = (IShellFolder2) // Marshal.GetObjectForIUnknown(iShellFolderPtr); // } // } //} return(ret == WinError.S_OK ? WinError.S_OK : WinError.E_FAIL); }