I wondered how I can simulate the Windows explorer listview of files. Here is what I found. It might be useful to someone. If you create a simple listview control and populate it with files/folders, you'll notice that you can't:
- Easily detect changes to files (rename, delete, copy/move...etc) while user is viewing the list
- Send To menu is not populated if you try to use the shell's menu for your items
- There doesn't seem to be a way of getting the column names used in shellview (filename, size, owner, times, and many others)
I found that Windows explorer and File Open dialog expose
IShellBrowser, which is used by
IShellView to create the listview of files. So, I created a simple app with WTL. Implemented basic
IShellBrowser methods and exposed it to
IShellFolder::CreateViewObject. Finally, to create the listview I called
IShellView::CreateViewWindow. I didn't try to merge the menus.
Things I couldn't get to work:
- Toolbar buttons (they were added to my toolbar, but bitmaps were messed up). They do function however.
- The most important one for me was that I couldn't easily detect when user wanted to open/explore/search the selected folder so I could sync the file tree.
IShellBrowser::BrowseObject was never even called, so I didn't implement it, but it should be implemented because most NSEs use this method. I did find that the shellview sends
WM_DDE* messages and if you respond properly you'll get the info about the action user taken. The needed messages are
WM_DDE_TERMINATE. WM_DDE_EXECUTE will give you string such as
"[ViewFolder("C:\Documents and Settings\leon\Desktop\billing", :428:780, 1)]". I have no idea what the 428:780 stand for. But action would be ViewFolder/ExploreFolder/FindFolder. It would be nice if Microsoft documented this stuff then we could use it. But as things stand now they even say in the MSDN:
"You do not implement this interface directly.
IShellBrowser is implemented by Windows Explorer and by the Windows File Open common dialog box."
But then why did they tell us about WM_GETISHELLBROWSER? Anyway, maybe it would be useful to someone, so here it is.
Some useful points:
- To get drag drop functioning in shellview, call
- Make sure you respond properly to WM_GETISHELLBROWSER or CreateView might crash
- Details listview seems to work only with
ICommDlgBrowser can be supported to have a simple listview like in common file dialog boxes (without webview)
- Don't name your executable as explorer.exe or unpleasant things will happen
Disclaimer: THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.