Hi Mercdev,
To navigate IE from your control, you only need to obtain IWebBrowser
interface. (Let me know if you still want to get IWebBrowser2, it should be
similar)
public class SimpleControl : System.Windows.Forms.Control
{
public SimpleControl()
: base()
{
Button btn = new Button();
btn.Parent = this;
btn.Text = "Button1";
btn.Location = new Point(10, 10);
btn.Click += new EventHandler(Btn_OnClick);
Controls.Add(btn);
}
//from shlguid.h
Guid SID_STopLevelBrowser = new Guid(0x4C96BE40, 0x915C, 0x11CF, 0x99,
0xD3, 0x00, 0xAA, 0x00, 0x4A, 0xE8, 0x37);
Guid SID_SWebBrowserApp = new Guid(0x0002DF05, 0x0000, 0x0000, 0xC0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
private void Btn_OnClick(object sender, EventArgs e)
{
Type typeIOleObject = this.GetType().GetInterface("IOleObject",
true);
object oleClientSite = typeIOleObject.InvokeMember("GetClientSite",
BindingFlags.Instance | BindingFlags.InvokeMethod |
BindingFlags.Public,
null, this, null);
IServiceProvider serviceProvider = oleClientSite as
IServiceProvider;
Guid guidIServiceProvider = typeof(IServiceProvider).GUID;
object objIServiceProvider;
serviceProvider.QueryService(ref SID_STopLevelBrowser, ref
guidIServiceProvider, out objIServiceProvider);
serviceProvider = objIServiceProvider as IServiceProvider;
object objIWebBrowser;
Guid guidIWebBrowser = typeof(IWebBrowser).GUID;
serviceProvider.QueryService(ref SID_SWebBrowserApp, ref
guidIWebBrowser, out objIWebBrowser);
IWebBrowser webBrowser = objIWebBrowser as IWebBrowser;
MessageBox.Show(webBrowser.LocationURL);
object flags = null;
object targetFrameName = null;
object postData = null;
object headers = null;
webBrowser.Navigate("about:blank", ref flags, ref targetFrameName,
ref postData, ref headers);
}
}
[ComImport, Guid("6d5140c1-7436-11ce-8034-00aa006009fa"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IServiceProvider
{
void QueryService(ref Guid guidService, ref Guid riid,
[MarshalAs(UnmanagedType.Interface)] out object ppvObject);
}
[ComImport, TypeLibType((short)0x1050),
Guid("EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B")]
public interface IWebBrowser
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(100)]
void GoBack();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0x65)]
void GoForward();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0x66)]
void GoHome();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0x67)]
void GoSearch();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0x68)]
void Navigate([In, MarshalAs(UnmanagedType.BStr)] string URL, [In,
Optional, MarshalAs(UnmanagedType.Struct)] ref object Flags, [In, Optional,
MarshalAs(UnmanagedType.Struct)] ref object TargetFrameName, [In, Optional,
MarshalAs(UnmanagedType.Struct)] ref object PostData, [In, Optional,
MarshalAs(UnmanagedType.Struct)] ref object Headers);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(-550)]
void Refresh();
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0x69)]
void Refresh2([In, Optional, MarshalAs(UnmanagedType.Struct)] ref
object Level);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0x6a)]
void Stop();
[DispId(200)]
object Application { [return: MarshalAs(UnmanagedType.IDispatch)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(200)] get; }
[DispId(0xc9)]
object Parent { [return: MarshalAs(UnmanagedType.IDispatch)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0xc9)] get; }
[DispId(0xca)]
object Container { [return: MarshalAs(UnmanagedType.IDispatch)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0xca)] get; }
[DispId(0xcb)]
object Document { [return: MarshalAs(UnmanagedType.IDispatch)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0xcb)] get; }
[DispId(0xcc)]
bool TopLevelContainer { [MethodImpl(MethodImplOptions.InternalCall,
MethodCodeType = MethodCodeType.Runtime), DispId(0xcc)] get; }
[DispId(0xcd)]
string Type { [return: MarshalAs(UnmanagedType.BStr)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0xcd)] get; }
[DispId(0xce)]
int Left { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0xce)] get; [param: In]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0xce)] set; }
[DispId(0xcf)]
int Top { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0xcf)] get; [param: In]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0xcf)] set; }
[DispId(0xd0)]
int Width { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType
= MethodCodeType.Runtime), DispId(0xd0)] get; [param: In]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0xd0)] set; }
[DispId(0xd1)]
int Height { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType
= MethodCodeType.Runtime), DispId(0xd1)] get; [param: In]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0xd1)] set; }
[DispId(210)]
string LocationName { [return: MarshalAs(UnmanagedType.BStr)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(210)] get; }
[DispId(0xd3)]
string LocationURL { [return: MarshalAs(UnmanagedType.BStr)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType =
MethodCodeType.Runtime), DispId(0xd3)] get; }
[DispId(0xd4)]
bool Busy { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType
= MethodCodeType.Runtime), DispId(0xd4)] get; }
}
Summary:
1) Define IServiceProvider and IWebBrowser com interface in .NET
2) When the control is hosted in IE, first try to get the IOleObject
interface, then use reflection to call GetClientSite to get the
IServiceProvider interface.
This will require UnmanagedCode and Reflection permission set.
Let me know if this works for you.
Regards,
Walter Wang (
[email protected], remove 'online.')
Microsoft Online Community Support
==================================================
When responding to posts, please "Reply to Group" via your newsreader so
that others may learn and benefit from your issue.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.