So wird der eingebettete Explorer IShellView als durchsuchbar angezeigt (d. h. das Ereignis BrowseObject wird ausgelöst)

9

Ich bin "Windows Explorer einbetten" in meiner Win32-Anwendung. (Technisch bin ich Gastgeber eines ShellView von ein Ordner in meiner Anwendung, was Windows Explorer tut).

Das Problem ist, dass die Ansicht niemals IShellBrowser.BrowseObject aufruft. Anstatt nach mir zu fragen, um zu einem neuen Speicherort zu navigieren (durch das BrowseObject-Ereignis), startet die Shell-Ansicht eine Kopie von Windows Explorer, um den Ordner anzuzeigen.

Ich möchte, dass die Standard-Shell-Ansicht (umgangssprachlich bekannt als DefView) durchsuchbar ist.

Tutorial zum Beispielcode

Zuerst müssen wir die IShellFolder für einen Ordner, den ich anzeigen möchte. Der einfachste Ordner ist der Desktop-Ordner, da es eine SHGetDesktopFolder API dafür:

%Vor%

Als nächstes fragen wir den Desktop-Ordner nach hand uns sein IShellView :

%Vor%

Nun, da wir den IShellView des Ordners haben (im Gegensatz zum IContextMenu oder IExtractIcon ), möchten wir nun die Shell anzeigen Ansicht durch Aufruf von IShellView.CreateViewWindow :

%Vor%

et voila, die erkennbare Shell-Listenansicht, die meinen Desktop zeigt:

mit Kontext-Menü-Handlern abschließen:

Wenn ich jedoch auf Öffnen klicke, anstatt mir eine BrowseObject Ereignis durch die IShellBrowser Schnittstelle, die ich geliefert habe, öffnet ein neues Fenster:

Dasselbe passiert, wenn ich doppelt klicke.

Wie kann ich Microsofts DefView durchsuchbar machen?

Aktualisieren ShellBrowser-Implementierung

Wenn Sie eine IShellView erstellen, müssen Sie ihr ein Objekt geben, das IShellBrowser implementiert. Dieses ShellBrowser -Objekt ist, wie die Ansicht zurück zum Hosting-Container kommuniziert.

Von den 15 Methoden schaue ich nur genau auf vier - der Rest kann E_NOTIMPL zurückgeben (was natürlich das Problem sein kann):

%Vor%
  • BrowseObject(PCUIDLIST_RELATIVE pidl, UINT wFlags);

    %Vor%
  • GetControlWindow(UINT id, HWND *lphwnd);

    %Vor%
  • SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret);

    %Vor%
  • GetViewStateStream(DWORD grfMode, IStream **ppStrm);

    %Vor%
  • TranslateAcceleratorSB(LPMSG lpmsg, WORD wID);

    %Vor%
  • OnViewWindowActive(IShellView *ppshv);

    %Vor%
  • QueryActiveShellView(IShellView **ppshv);

    %Vor%
  • EnableModelessSB(BOOL fEnable);

    %Vor%
  • InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);

    %Vor%
  • RemoveMenusSB(HMENU hmenuShared);

    %Vor%
  • SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject);

    %Vor%
  • SetStatusTextSB

    %Vor%
  • SetToolbarItems(LPTBBUTTONSB lpButtons, UINT nButtons, UINT uFlags);

    %Vor%

Dann gibt es den Vorfahren IOleWindow :

  • GetWindow([out] HWND *phwnd);

    %Vor%
  • 'ContextSensitiveHelp ([in] BOOL fEnterMode);

    %Vor%

IServiceProvider

%Vor%

Bonuslesen

Siehe auch

Ian Boyd 08.10.2011, 17:41
quelle

2 Antworten

2

Unter Vista oder höher können Sie zum Hosting von ExplorerBrowser wechseln, von dem aus Sie QI IObjectWithSite übergeben und ein Objekt übergeben können, das IServiceProvier mit Diensten wie SID_SShellBrowser oder SID_SInPlaceBrowser implementiert.

Unter XP müssen Sie wahrscheinlich DDE-Nachrichten verarbeiten, die von Ihrem Prozess stammen, da die Standardordnerzuordnung DDE ist.

    
Sheng Jiang 蒋晟 08.10.2011, 21:24
quelle
1

Einige fehlende Code, den ich verwendet habe, um dieses Beispiel zu reproduzieren.

%Vor%

Danach implementieren Sie die IShellBrowser Schnittstelle und holen Sie sich die Variable FShellBrowser .

%Vor%

Verwenden Sie FShellBrowser in:

%Vor%

Wenn Sie auf ein Verzeichnis klicken, wird nur Folgendes generiert:

%Vor%

Ein weiteres Problem mit diesem Code ist: Wie Sie dem Explorer mitteilen, dass die Größe des Formulars geändert wurde und Sie die Größe des gehosteten Explorers ändern möchten. Explorer-Browser hat die Methode SetRect .

Ich stimme der Verwendung von IExplorerBrowser zu.

    
Raf Bakker 19.11.2013 11:58
quelle