exBrowser.vb
上传用户:szledliu
上传日期:2021-01-29
资源大小:13805k
文件大小:15k
源码类别:

C#编程

开发平台:

C#

  1. #Region " Read Me "
  2. 'Unfortunatelty the Web Browser control in VS2005 is just a wrapper of IE ActiveX control and not a very
  3. 'complete one, some methods were added to make some of the features you would want
  4. 'easier to access, but unfortunately to get some features you would want the easy way such as find
  5. 'and other dialogs that IE can show, you still have to reference 'SHDocVw' (the ie active x control).
  6. 'I decided to find a way to get at this functionality without referencing the SHDocVW.DLL directly in the 
  7. 'project and instead import the required features at runtime and then release them.
  8. #End Region
  9. Imports System
  10. Imports System.Text
  11. Imports System.Windows.Forms
  12. Imports System.ComponentModel
  13. Imports System.Collections.Generic
  14. Imports System.Runtime.InteropServices
  15. Imports System.Security.Permissions
  16. <PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
  17. <System.Runtime.InteropServices.ComVisibleAttribute(True)> _
  18. Public Class exBrowser
  19.     Inherits System.Windows.Forms.WebBrowser
  20. #Region " COM Imports Etc..."
  21.     <StructLayout(LayoutKind.Sequential)> _
  22. Public Structure OLECMDTEXT
  23.         Public cmdtextf As UInt32
  24.         Public cwActual As UInt32
  25.         Public cwBuf As UInt32
  26.         Public rgwz As Char
  27.     End Structure
  28.     <StructLayout(LayoutKind.Sequential)> _
  29.     Public Structure OLECMD
  30.         Public cmdID As Long
  31.         Public cmdf As UInt64
  32.     End Structure
  33.     ' Interop - IOleCommandTarget (See MSDN - http://support.microsoft.com/?kbid=311288)
  34.     <ComImport(), Guid("b722bccb-4e68-101b-a2bc-00aa00404770"), _
  35.     InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
  36.     Public Interface IOleCommandTarget
  37.         Sub QueryStatus(ByRef pguidCmdGroup As Guid, ByVal cCmds As UInt32, _
  38.             <MarshalAs(UnmanagedType.LPArray, SizeParamIndex:=1)> ByVal prgCmds As OLECMD, _
  39.             ByRef pCmdText As OLECMDTEXT)
  40.         Sub Exec(ByRef pguidCmdGroup As Guid, ByVal nCmdId As Long, _
  41.             ByVal nCmdExecOpt As Long, ByRef pvaIn As Object, _
  42.             ByRef pvaOut As Object)
  43.     End Interface
  44.     Private cmdGUID As New Guid(&HED016940, -17061, _
  45.   &H11CF, &HBA, &H4E, &H0, &HC0, &H4F, &HD7, &H8, &H16)
  46. #Region " Commands Enumeration "
  47.     'There are a ton of ole commands, we are only using a couple, msdn research will
  48.     'allow you to figure out which ones you want to use.
  49.     Enum oCommands As Long
  50.         Options
  51.         Find = 1
  52.         ViewSource = 2
  53.         '////////////////////////////////////////
  54.         ID_FILE_SAVEAS = 32771
  55.         ID_FILE_PAGESETUP = 32772
  56.         ID_FILE_IMPORTEXPORT = 32774
  57.         ID_FILE_PRINTPREVIEW = 32776
  58.         ID_FILE_NEWIE = 32779
  59.         ID_FILE_NEWMAIL = 32780
  60.         PID_FILE_NEWINTERNETCALL = 32781
  61.         ID_FILE_ADDTRUST = 32782
  62.         ID_FILE_ADDLOCAL = 32783
  63.         DLCTL_BGSOUNDS = &H40
  64.         DLCTL_DLIMAGES = &H10
  65.         DLCTL_DOWNLOADONLY = &H800
  66.         DLCTL_FORCEOFFLINE = &H10000000
  67.         DLCTL_NO_BEHAVIORS = &H800
  68.         DLCTL_NO_CLIENTPULL = &H20000000
  69.         DLCTL_NO_DLACTIVEXCTLS = &H400
  70.         DLCTL_NO_FRAMEDOWNLOAD = &H1000
  71.         DLCTL_NO_JAVA = &H100
  72.         DLCTL_NO_METACHARSET = &H10000
  73.         DLCTL_NO_RUNACTIVEXCTLS = &H200
  74.         DLCTL_NO_SCRIPTS = &H80
  75.         'DLCTL_OFFLINE DLCTL_OFFLINEIFNOTCONNECTED
  76.         DLCTL_OFFLINEIFNOTCONNECTED = &H80000000
  77.         DLCTL_PRAGMA_NO_CACHE = &H4000
  78.         DLCTL_RESYNCHRONIZE = &H2000
  79.         DLCTL_SILENT = &H40000000
  80.         DLCTL_URL_ENCODING_DISABLE_UTF8 = &H20000
  81.         DLCTL_URL_ENCODING_ENABLE_UTF8 = &H40000
  82.         DLCTL_VIDEOS = &H20
  83.     End Enum
  84. #End Region
  85. #End Region
  86.     'Just a little easier way to get at it.
  87.     Public ReadOnly Property CurrentURL() As String
  88.         Get
  89.             Return Me.Document.Url.ToString
  90.         End Get
  91.     End Property
  92.     Public Sub New()
  93.         MyBase.New()
  94.     End Sub
  95. #Region " Dialogs "
  96.     Public Sub ShowOpen()
  97.         Dim cdlOpen As New OpenFileDialog
  98.         Try
  99.             cdlOpen.Filter = "HTML Files (*.htm)|*.htm|HTML Files (*.html)|*.html|TextFiles" & _
  100.                 "(*.txt)|*.txt|Gif Files (*.gif)|*.gif|JPEG Files (*.jpg)|*.jpeg|" & _
  101.                 "PNG Files (*.png)|*.png|Art Files (*.art)|*.art|AU Fles (*.au)|*.au|" & _
  102.                 "AIFF Files (*.aif|*.aiff|XBM Files (*.xbm)|*.xbm|All Files (*.*)|*.*"
  103.             cdlOpen.Title = " Open File "
  104.             cdlOpen.ShowDialog()
  105.             If cdlOpen.FileName > Nothing Then
  106.                 Me.Navigate(cdlOpen.FileName)
  107.             End If
  108.         Catch ex As Exception
  109.             Throw New Exception(ex.Message.ToString)
  110.         End Try
  111.     End Sub
  112.     Public Sub ShowSource()
  113.         Dim cmdt As IOleCommandTarget
  114.         Dim o As Object = Nothing
  115.         Dim oIE As Object = Nothing
  116.         Try
  117.             cmdt = CType(Me.Document.DomDocument, IOleCommandTarget)
  118.             cmdt.Exec(cmdGUID, oCommands.ViewSource, 1, o, o)
  119.         Catch ex As Exception
  120.             Throw New Exception(ex.Message.ToString, ex.InnerException)
  121.         Finally
  122.             cmdt = Nothing
  123.         End Try
  124.     End Sub
  125.     Public Sub ShowFindDialog()
  126.         Dim cmdt As IOleCommandTarget
  127.         Dim o As Object = Nothing
  128.         Dim oIE As Object = Nothing
  129.         Try
  130.             cmdt = CType(Me.Document.DomDocument, IOleCommandTarget)
  131.             cmdt.Exec(cmdGUID, oCommands.Find, 0, o, o)
  132.         Catch ex As Exception
  133.             Throw New Exception(ex.Message.ToString, ex.InnerException)
  134.         Finally
  135.             cmdt = Nothing
  136.         End Try
  137.     End Sub
  138.     Public Sub AddToFavorites(Optional ByVal strURL As String = "", Optional ByVal strTitle As String = "")
  139.         Dim oHelper As Object = Nothing
  140.         Try
  141.             oHelper = New ShellUIHelper
  142.             oHelper.AddFavorite(Me.Document.Url.ToString, Me.DocumentTitle.ToString)
  143.         Catch ex As Exception
  144.             Throw New Exception(ex.Message.ToString)
  145.         End Try
  146.         If oHelper IsNot Nothing AndAlso Marshal.IsComObject(oHelper) Then
  147.             Marshal.ReleaseComObject(oHelper)
  148.         End If
  149.     End Sub
  150.     Public Sub ShowOrganizeFavorites()
  151.         'Organize Favorites
  152.         Dim helper As Object = Nothing
  153.         Try
  154.             helper = New ShellUIHelper()
  155.             helper.ShowBrowserUI("OrganizeFavorites", 0)
  156.         Finally
  157.             If helper IsNot Nothing AndAlso Marshal.IsComObject(helper) Then
  158.                 Marshal.ReleaseComObject(helper)
  159.             End If
  160.         End Try
  161.     End Sub
  162.     Public Sub SendToDesktop()
  163.         'Shortcut to desktop
  164.         Dim helper As Object = Nothing
  165.         Try
  166.             helper = New ShellUIHelper()
  167.             helper.AddDesktopComponent(Me.Document.Url.ToString, "website")
  168.         Finally
  169.             If helper IsNot Nothing AndAlso Marshal.IsComObject(helper) Then
  170.                 Marshal.ReleaseComObject(helper)
  171.             End If
  172.         End Try
  173.     End Sub
  174.     ''' <summary>
  175.     ''' This Will launch the internet option dialog.
  176.     ''' </summary>
  177.     ''' <remarks></remarks>
  178.     Public Sub ShowInternetOptions()
  179.         Shell("rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,0", vbNormalFocus)
  180.     End Sub
  181.     Public Sub ShowPrivacyReport()
  182.         Shell("rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,2", vbNormalFocus)
  183.     End Sub
  184. #End Region
  185. #Region " Extended "
  186.     <ComImport(), _
  187.         Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), _
  188.         InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch), _
  189.         TypeLibType(TypeLibTypeFlags.FHidden)> _
  190.         Public Interface DWebBrowserEvents2
  191.         <DispId(250)> _
  192.         Sub BeforeNavigate2(<[In](), MarshalAs(UnmanagedType.IDispatch)> ByVal pDisp As Object, _
  193.         <InAttribute(), MarshalAs(UnmanagedType.BStr)> ByRef URL As String, _
  194.         <InAttribute()> ByRef flags As Object, _
  195.         <InAttribute(), MarshalAs(UnmanagedType.BStr)> ByRef targetFrameName As String, _
  196.         <InAttribute()> ByRef postdata As Object, _
  197.         <InAttribute(), MarshalAs(UnmanagedType.BStr)> ByRef headers As String, _
  198.         <InAttribute(), OutAttribute()> ByRef cancel As Boolean)
  199.         'Note: Postdata is a SafeArray but for some reason, if I do a proper declaration, the event will not be raised:
  200.         '<[In](), MarshalAs(UnmanagedType.SafeArray, safearraysubtype:=VarEnum.VT_UI1)> ByRef postdata() As Byte, _
  201.         <DispId(273)> _
  202.         Sub NewWindow3(<InAttribute(), MarshalAs(UnmanagedType.IDispatch)> ByVal pDisp As Object, _
  203.         <InAttribute(), OutAttribute()> ByRef cancel As Boolean, _
  204.         <InAttribute()> ByRef Flags As Object, _
  205.         <InAttribute(), MarshalAs(UnmanagedType.BStr)> ByRef UrlContext As String, _
  206.         <InAttribute(), MarshalAs(UnmanagedType.BStr)> ByRef Url As String)
  207.     End Interface
  208.     Public Enum NWMF
  209.         NWMF_UNLOADING = &H1&
  210.         NWMF_USERINITED = &H2&
  211.         NWMF_FIRST_USERINITED = &H4&
  212.         NWMF_OVERRIDEKEY = &H8&
  213.         NWMF_SHOWHELP = &H10&
  214.         NWMF_HTMLDIALOG = &H20&
  215.         NWMF_FROMPROXY = &H40&
  216.     End Enum
  217.     Private cookie As AxHost.ConnectionPointCookie
  218.     Private wevents As WebBrowserExtendedEvents
  219.     'This method will be called to give you a chance to create your own event sink
  220.     Protected Overrides Sub CreateSink()
  221.         'MAKE SURE TO CALL THE BASE or the normal events won't fire
  222.         MyBase.CreateSink()
  223.         wevents = New WebBrowserExtendedEvents(Me)
  224.         cookie = New AxHost.ConnectionPointCookie(Me.ActiveXInstance, wevents, GetType(DWebBrowserEvents2))
  225.     End Sub
  226.     Protected Overrides Sub DetachSink()
  227.         If Not cookie Is Nothing Then
  228.             cookie.Disconnect()
  229.             cookie = Nothing
  230.         End If
  231.         MyBase.DetachSink()
  232.     End Sub
  233.     'This new event will fire when the page is navigating
  234.     Public Delegate Sub WebBrowserNavigatingExtendedEventHandler(ByVal sender As Object, ByVal e As WebBrowserNavigatingExtendedEventArgs)
  235.     Public Event NavigatingExtended As WebBrowserNavigatingExtendedEventHandler
  236.     'This event will fire when a new window is about to be opened
  237.     Public Delegate Sub WebBrowserNewWindowExtendedEventHandler(ByVal sender As Object, ByVal e As WebBrowserNewWindowExtendedEventArgs)
  238.     Public Event NewWindowExtended As WebBrowserNewWindowExtendedEventHandler
  239.     Protected Friend Sub OnNavigatingExtended(ByVal Url As String, ByVal Frame As String, ByVal Postdata As Byte(), ByVal Headers As String, ByRef Cancel As Boolean)
  240.         Dim e As WebBrowserNavigatingExtendedEventArgs = New WebBrowserNavigatingExtendedEventArgs(Url, Frame, Postdata, Headers)
  241.         RaiseEvent NavigatingExtended(Me, e)
  242.         Cancel = e.Cancel
  243.     End Sub
  244.     Protected Friend Sub OnNewWindowExtended(ByVal Url As String, ByRef Cancel As Boolean, ByVal Flags As NWMF, ByVal UrlContext As String)
  245.         Dim e As WebBrowserNewWindowExtendedEventArgs = New WebBrowserNewWindowExtendedEventArgs(Url, UrlContext, Flags)
  246.         RaiseEvent NewWindowExtended(Me, e)
  247.         Cancel = e.Cancel
  248.     End Sub
  249.     Public Overloads Sub Navigate2(ByVal URL As String)
  250.         MyBase.Navigate(URL)
  251.     End Sub
  252. #End Region
  253. #Region " Extended Event Classes "
  254.     'This class will capture events from the WebBrowser
  255.     Friend Class WebBrowserExtendedEvents
  256.         Inherits System.Runtime.InteropServices.StandardOleMarshalObject
  257.         Implements DWebBrowserEvents2
  258.         Private m_Browser As exBrowser
  259.         Public Sub New(ByVal browser As exBrowser)
  260.             m_Browser = browser
  261.         End Sub
  262.         'Implement whichever events you wish
  263.         Public Sub BeforeNavigate2(ByVal pDisp As Object, ByRef URL As String, ByRef flags As Object, ByRef targetFrameName As String, ByRef postData As Object, ByRef headers As String, ByRef cancel As Boolean) Implements DWebBrowserEvents2.BeforeNavigate2
  264.             m_Browser.OnNavigatingExtended(URL, targetFrameName, CType(postData, Byte()), headers, cancel)
  265.         End Sub
  266.         Public Sub NewWindow3(ByVal pDisp As Object, ByRef Cancel As Boolean, ByRef Flags As Object, ByRef UrlContext As String, ByRef Url As String) Implements DWebBrowserEvents2.NewWindow3
  267.             m_Browser.OnNewWindowExtended(Url, Cancel, CType(Flags, NWMF), UrlContext)
  268.         End Sub
  269.     End Class
  270.     Public Class WebBrowserNewWindowExtendedEventArgs
  271.         Inherits CancelEventArgs
  272.         Private m_Url As String
  273.         Private m_UrlContext As String
  274.         Private m_Flags As NWMF
  275.         Public ReadOnly Property Url() As String
  276.             Get
  277.                 Return m_Url
  278.             End Get
  279.         End Property
  280.         Public ReadOnly Property UrlContext() As String
  281.             Get
  282.                 Return m_UrlContext
  283.             End Get
  284.         End Property
  285.         Public ReadOnly Property Flags() As NWMF
  286.             Get
  287.                 Return m_Flags
  288.             End Get
  289.         End Property
  290.         Public Sub New(ByVal url As String, ByVal urlcontext As String, ByVal flags As NWMF)
  291.             m_Url = url
  292.             m_UrlContext = urlcontext
  293.             m_Flags = flags
  294.         End Sub
  295.     End Class
  296.     'First define a new EventArgs class to contain the newly exposed data
  297.     Public Class WebBrowserNavigatingExtendedEventArgs
  298.         Inherits CancelEventArgs
  299.         Private m_Url As String
  300.         Private m_Frame As String
  301.         Private m_Postdata() As Byte
  302.         Private m_Headers As String
  303.         Public ReadOnly Property Url() As String
  304.             Get
  305.                 Return m_Url
  306.             End Get
  307.         End Property
  308.         Public ReadOnly Property Frame() As String
  309.             Get
  310.                 Return m_Frame
  311.             End Get
  312.         End Property
  313.         Public ReadOnly Property Headers() As String
  314.             Get
  315.                 Return m_Headers
  316.             End Get
  317.         End Property
  318.         Public ReadOnly Property Postdata() As String
  319.             Get
  320.                 Return PostdataToString(m_Postdata)
  321.             End Get
  322.         End Property
  323.         Public ReadOnly Property PostdataByte() As Byte()
  324.             Get
  325.                 Return m_Postdata
  326.             End Get
  327.         End Property
  328.         Public Sub New(ByVal url As String, ByVal frame As String, ByVal postdata As Byte(), ByVal headers As String)
  329.             m_Url = url
  330.             m_Frame = frame
  331.             m_Postdata = postdata
  332.             m_Headers = headers
  333.         End Sub
  334.         Private Function PostdataToString(ByVal p() As Byte) As String
  335.             'not sexy but it works...
  336.             Dim tabpd() As Byte, bstop As Boolean = False, stmp As String = "", i As Integer = 0
  337.             tabpd = p
  338.             If tabpd Is Nothing OrElse tabpd.Length = 0 Then
  339.                 Return ""
  340.             Else
  341.                 For i = 0 To tabpd.Length - 1
  342.                     stmp += ChrW(tabpd(i))
  343.                 Next
  344.                 stmp = Replace(stmp, ChrW(13), "")
  345.                 stmp = Replace(stmp, ChrW(10), "")
  346.                 stmp = Replace(stmp, ChrW(0), "")
  347.             End If
  348.             If stmp = Nothing Then
  349.                 Return ""
  350.             Else
  351.                 Return stmp
  352.             End If
  353.         End Function
  354.     End Class
  355. #End Region
  356.     <ComImport(), Guid("64AB4BB7-111E-11D1-8F79-00C04FC2FBE1")> _
  357.     Public Class ShellUIHelper
  358.         '
  359.     End Class
  360. End Class