public OpenFileDialogCreationListener( IWin32Window parent ) { _subClasser = new WindowSubClasser(parent, new WndProcDelegate(WndProc)); _subClasser.Install(); }
/// <summary> /// Initialize MSHTML by creating a new MSHTML instance, running it, and /// in-place activating it. The call to IOleObject.DoVerb will result in /// a call to our IOleDocumentSite.ActivateMe method where we will conclude /// the initialization sequence. /// /// This method is based on the CFramerDocument::CreateNewDocObject method /// from the FramerEx sample (referenced above in the class comment). /// Differences in our implementation include the fact that we don't use /// IPersistStorage or IPersistFile to load the contents of the document, /// we don't call IOleObject.SetHostNames, and we don't call IOleObject.Advise /// to set up an IAdviseSink (not necessary since we don't need notifications /// of changes to the data or view). /// </summary> private void InitializeMSHTML() { // Create the html document htmlDocument = (IHTMLDocument2)new HTMLDocumentClass(); // Query for its IOleObject interface (core OLE embedded object interface) oleObject = (IOleObject)htmlDocument; // Put the compound document object into the running state int result = Ole32.OleRun(oleObject); if (result != HRESULT.S_OK) Marshal.ThrowExceptionForHR(result); // Inform the embedded object of its "client-site" (i.e. container) oleObject.SetClientSite((IOleClientSite)(this)); // Lock the OleObject into it's running state (we will unlock it during Dispose) result = Ole32.OleLockRunning(oleObject, true, false); if (result != HRESULT.S_OK) Marshal.ThrowExceptionForHR(result); // Get the boundaries of the container RECT containerRect; GetContainerRect(out containerRect); // In-Place Activate the MSHTML ActiveDocument (will result in a call to // IOleDocumentSite.ActivateMe where initialization will continue) result = oleObject.DoVerb( OLEIVERB.INPLACEACTIVATE, // request in-place activation IntPtr.Zero, // MSG for event that invoked the verb (none) (IOleClientSite)(this), // client site for activation 0, // reserved (must be 0) this.Handle, // parent-window for active object ref containerRect); // bounding rectangle in parent window // check for DoVerb error if (result != HRESULT.S_OK) Marshal.ThrowExceptionForHR(result); // hookup to document events documentEventRepeater = new HtmlDocumentEventRepeater(htmlDocument); // If FindForm() is null, this editor is not hosted in a // managed window, thus, we must subclass the window to wait for // control key press to push through to PreProcessMessage // that would normally come through the managed message pump if (FindForm() == null) { NativeWindow nw = new NativeWindow(); nw.AssignHandle(MshtmlWindowHandle); windowSubClasser = new WindowSubClasser(nw, new WndProcDelegate(WndProcDelegate)); windowSubClasser.Install(); } }