1.引用Microsoft.mshtml
Microsoft.mshtml的路徑是C:/Program Files/Microsoft.NET/Primary Interop Assemblies/Microsoft.mshtml.dll,添加引用後在ActiveX對應類中編寫:
using mshtml;
2.用c#實現兩個COM類,IOleClientSite和IOleContainer
using System.Runtime.InteropServices;[ComImport, Guid("00000118-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]public interface IOleClientSite{ void SaveObject(); void GetMoniker(uint dwAssign, uint dwWhichMoniker, object ppmk); void GetContainer(out IOleContainer ppContainer); void ShowObject(); void OnShowWindow(bool fShow); void RequestNewObjectLayout();}[ComImport, Guid("0000011B-0000-0000-C000-000000000046"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]public interface IOleContainer{ void EnumObjects([In, MarshalAs(UnmanagedType.U4)] int grfFlags, [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppenum); void ParseDisplayName([In, MarshalAs(UnmanagedType.Interface)] object pbc, [MarshalAs(UnmanagedType.BStr)] string pszDisplayName, [Out, MarshalAs(UnmanagedType.LPArray)] int[] pchEaten, [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppmkOut); void LockContainer([In, MarshalAs(UnmanagedType.I4)] int fLock);}
3.調用JavaScript方法
在Activex控制項的對應類中就可以編寫如下的CallJavaScript方法:
private void CallJavaScript(string Filenames){ Type typeIOleObject = this.GetType().GetInterface("IOleObject", true); object oleClientSite = typeIOleObject.InvokeMember("GetClientSite", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, this, null); IOleClientSite oleClientSite2 = oleClientSite as IOleClientSite; IOleContainer pObj; oleClientSite2.GetContainer(out pObj); //參數數組 object[] args = new object[1]; args[0] = Filenames; //擷取頁面的Script集合 IHTMLDocument pDoc2 = (IHTMLDocument) pObj; object script = pDoc2.Script; try { //調用JavaScript方法OnScaned並傳遞參數,因為此方法可能並沒有在頁面中實現,所以要進行異常處理 script.GetType().InvokeMember("OnScaned", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, script, args); } catch { }}
4.在頁面中實現相應的JavaScript方法
在包含這個ActiveX控制項的頁面中添加如下的JavaScript方法:
<mce:script type="text/javascript"><!--function OnScaned(files){ if (files) { //do something }}// --></mce:script>
這樣,在ActiveX控制項中調用CallJavaScript方法時,最終就會調用到頁面中的OnScaned方法,藉此實現了ActiveX的“事件”機制。