123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- # A sample of using Vista's IExplorerBrowser interfaces...
- # Currently doesn't quite work:
- # * CPU sits at 100% while running.
- import sys
- import pythoncom
- from win32com.shell import shell, shellcon
- import win32gui, win32con, win32api
- from win32com.server.util import wrap, unwrap
- # event handler for the browser.
- IExplorerBrowserEvents_Methods = """OnNavigationComplete OnNavigationFailed
- OnNavigationPending OnViewCreated""".split()
- class EventHandler:
- _com_interfaces_ = [shell.IID_IExplorerBrowserEvents]
- _public_methods_ = IExplorerBrowserEvents_Methods
- def OnNavigationComplete(self, pidl):
- print "OnNavComplete", pidl
- def OnNavigationFailed(self, pidl):
- print "OnNavigationFailed", pidl
- def OnNavigationPending(self, pidl):
- print "OnNavigationPending", pidl
- def OnViewCreated(self, view):
- print "OnViewCreated", view
- # And if our demo view has been registered, it may well
- # be that view!
- try:
- pyview = unwrap(view)
- print "and look - its a Python implemented view!", pyview
- except ValueError:
- pass
- class MainWindow:
- def __init__(self):
- message_map = {
- win32con.WM_DESTROY: self.OnDestroy,
- win32con.WM_COMMAND: self.OnCommand,
- win32con.WM_SIZE: self.OnSize,
- }
- # Register the Window class.
- wc = win32gui.WNDCLASS()
- hinst = wc.hInstance = win32api.GetModuleHandle(None)
- wc.lpszClassName = "test_explorer_browser"
- wc.lpfnWndProc = message_map # could also specify a wndproc.
- classAtom = win32gui.RegisterClass(wc)
- # Create the Window.
- style = win32con.WS_OVERLAPPEDWINDOW | win32con.WS_VISIBLE
- self.hwnd = win32gui.CreateWindow( classAtom, "Python IExplorerBrowser demo", style, \
- 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \
- 0, 0, hinst, None)
- eb = pythoncom.CoCreateInstance(shellcon.CLSID_ExplorerBrowser, None, pythoncom.CLSCTX_ALL, shell.IID_IExplorerBrowser)
- # as per MSDN docs, hook up events early
- self.event_cookie = eb.Advise(wrap(EventHandler()))
- eb.SetOptions(shellcon.EBO_SHOWFRAMES)
- rect = win32gui.GetClientRect(self.hwnd)
- # Set the flags such that the folders autoarrange and non web view is presented
- flags = (shellcon.FVM_LIST, shellcon.FWF_AUTOARRANGE | shellcon.FWF_NOWEBVIEW)
- eb.Initialize(self.hwnd, rect, (0, shellcon.FVM_DETAILS))
- if len(sys.argv)==2:
- # If an arg was specified, ask the desktop parse it.
- # You can pass anything explorer accepts as its '/e' argument -
- # eg, "::{guid}\::{guid}" etc.
- # "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" is "My Computer"
- pidl = shell.SHGetDesktopFolder().ParseDisplayName(0, None, sys.argv[1])[1]
- else:
- # And start browsing at the root of the namespace.
- pidl = []
- eb.BrowseToIDList(pidl, shellcon.SBSP_ABSOLUTE)
- # and for some reason the "Folder" view in the navigator pane doesn't
- # magically synchronize itself - so let's do that ourself.
- # Get the tree control.
- sp = eb.QueryInterface(pythoncom.IID_IServiceProvider)
- try:
- tree = sp.QueryService(shell.IID_INameSpaceTreeControl,
- shell.IID_INameSpaceTreeControl)
- except pythoncom.com_error, exc:
- # this should really only fail if no "nav" frame exists...
- print "Strange - failed to get the tree control even though " \
- "we asked for a EBO_SHOWFRAMES"
- print exc
- else:
- # get the IShellItem for the selection.
- si = shell.SHCreateItemFromIDList(pidl, shell.IID_IShellItem)
- # set it to selected.
- tree.SetItemState(si, shellcon.NSTCIS_SELECTED, shellcon.NSTCIS_SELECTED)
- #eb.FillFromObject(None, shellcon.EBF_NODROPTARGET);
- #eb.SetEmptyText("No known folders yet...");
- self.eb = eb
- def OnCommand(self, hwnd, msg, wparam, lparam):
- pass
- def OnDestroy(self, hwnd, msg, wparam, lparam):
- print "tearing down ExplorerBrowser..."
- self.eb.Unadvise(self.event_cookie)
- self.eb.Destroy()
- self.eb = None
- print "shutting down app..."
- win32gui.PostQuitMessage(0)
- def OnSize(self, hwnd, msg, wparam, lparam):
- x = win32api.LOWORD(lparam)
- y = win32api.HIWORD(lparam)
- self.eb.SetRect(None, (0, 0, x, y))
- def main():
- w=MainWindow()
- win32gui.PumpMessages()
- if __name__=='__main__':
- main()
|