Bagaimana menangani peristiwa dokumen dalam Visual Basic.NET aplikasi

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 311284 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Artikel ini menunjukkan bagaimana untuk menangkap peristiwa dokumen untuk kontrol browser web dalam Visual Basic.NET.

Persyaratan

Daftar berikut menguraikan fitur perangkat keras, perangkat lunak, jaringan infrastruktur, dan paket layanan yang Anda butuhkan:
  • Microsoft Visual Studio.NET
  • Microsoft Internet Explorer 5.5 Paket Layanan 2 (SP2) atau yang lebih baru
Artikel ini mengasumsikan bahwa Anda sudah familiar dengan topik-topik berikut:
  • Visual Studio.NET
  • Internet Explorer
  • Kontrol browser web

Deskripsi teknik

Browser web kontrol adalah kontrol mudah untuk bekerja dengan dalam Visual Studio.NET atau versi sebelumnya dari Microsoft Visual Studio. Namun, Anda dapat menemukan lebih sulit untuk menangani peristiwa kontrol browser web dalam Visual Studio.NET.

Antarmuka acara berikut memperlihatkan sebagian besar peristiwa dokumen yang Anda menangani dalam aplikasi Anda:
Mshtml.HTMLDocumentEvents2_Event
				
Untuk menangani acara, Anda harus membuat Anda sendiri Sub prosedur atau fungsi yang Anda dapat ketika peristiwa terjadi. Anda harus cocok dengan tanda tangan dari acara yang kebakaran. Sebagai contoh, berikut Sub prosedur menangani Gunaka mouse di atas acara dokumen:
Private Sub document_onmouseover(ByVal e As mshtml.IHTMLEventObj)
				
Setelah event handler di tempat, Anda harus menghubungkan acara. Anda dapat menghubungkan peristiwa setiap saat setelah DocumentComplete peristiwa pada browser web pengendalian kebakaran. Berikut adalah sintaks kait:
AddHandler CType(document, _
mshtml.HTMLDocumentEvents2_Event).onmouseover, _
AddressOf Me.document_onmouseover
				
Kode ini panggilan AddHandler pernyataan dan menggunakan CType fungsi untuk melewati acara. The CType fungsi melemparkan objek dokumen untuk (jenis yang sesuaiMshtml.HTMLDocumentEvents2_Event), dan kemudian OnMouseOver acara berlalu dari itu. The Me.document_onmouseoverSub prosedur dilewatkan ke parameter kedua, AddressOf pernyataan, yang menyediakan alamat Anda Handler.

Membuat proyek dan menambahkan kode

Dalam contoh berikut, menelusuri kontrol browser web untuk http://www.microsoft.com. Setelah halaman load, sampel kait OnMouseOver dan OnClick peristiwa. Sampel kemudian menambahkan teks ke kotak daftar setiap kali peristiwa kebakaran.
  1. Mulai Visual Studio.NET.
  2. Membuat proyek aplikasi Windows baru dalam Visual Basic.NET
  3. Menambahkan referensi ke Microsoft.mshtml dalam proyek.
  4. Dalam toolbox, klik General.
  5. Klik kanan panel terbuka, dan kemudian klik Menyesuaikan Toolbox.
  6. Pilih Microsoft Web Browser Periksa kotak, dan kemudian klik Oke.
  7. Dalam toolbox, klik dua kali Explorer.
  8. Dalam toolbox, klik Windows Forms, kemudian klik dua kali ListBox kontrol.
  9. Mengatur kontrol sehingga mereka mudah untuk melihat pada formulir.
  10. Menambahkan kode berikut ke atas AssemblyInfo.vb, menggantikan kalimat impor ada
    Imports System
    Imports System.Drawing
    Imports System.Collections
    Imports System.ComponentModel
    Imports System.Windows.Forms
    Imports System.Data
    Imports System.Reflection
    Imports System.Runtime.InteropServices
    Imports System.Threading
    Imports System.Diagnostics
    
  11. Tambahkan kode berikut antara Kode Windows Form Designer dihasilkan dan Akhir kelas dalam tampilan kode Form1.vb Publik
    Shared dwCookie2 As Integer
        Public Sub add_list(ByVal a As Object)
            ListBox1.Items.Insert(0, a)
        End Sub
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            AxWebBrowser1.Navigate2("http://www.microsoft.com")
            Dim x As IEEvents = New IEEvents(AxWebBrowser1)
            x.fm = Me
        End Sub
    
        Private Sub AxWebBrowser1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AxWebBrowser1.Enter
    
        End Sub
    
        Private Sub AxWebBrowser1_DocumentComplete(ByVal sender As Object, ByVal e As AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent) Handles AxWebBrowser1.DocumentComplete
            Dim doc As mshtml.HTMLDocument
            doc = AxWebBrowser1.Document
    
            AddHandler CType(doc, _
                mshtml.HTMLDocumentEvents2_Event).onclick, AddressOf Document_onclick
            AddHandler CType(doc, _
         mshtml.HTMLDocumentEvents2_Event).onmouseover, AddressOf Document_onmouseover
        End Sub
    
        Private Sub AxWebBrowser1_BeforeNavigate2(ByVal sender As Object, ByVal e As AxSHDocVw.DWebBrowserEvents2_BeforeNavigate2Event) Handles AxWebBrowser1.BeforeNavigate2
            Dim doc As mshtml.HTMLDocument
            doc = AxWebBrowser1.Document
    
            RemoveHandler CType(doc, _
                mshtml.HTMLDocumentEvents2_Event).onclick, _
                AddressOf Document_onclick
            RemoveHandler CType(doc, _
                mshtml.HTMLDocumentEvents2_Event).onmouseover, _
                AddressOf Document_onmouseover
        End Sub
        Private Sub Document_onmouseover(ByVal e As mshtml.IHTMLEventObj)
            ListBox1.Items.Insert(0, "onMouseOver: " & _
                e.srcElement.tagName.ToString())
        End Sub
        Private Function Document_onclick(ByVal e As mshtml.IHTMLEventObj) _
                As Boolean
            ListBox1.Items.Insert(0, "onClick: " & _
                e.srcElement.tagName.ToString())
            Return True
        End Function
    
  12. Tambahkan kode berikut setelah Akhir kelas
    Public Class IEHTMLDocumentEvents
        Implements mshtml.HTMLDocumentEvents2
        Public Sub onactivate(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onactivate
    
        End Sub
    
        Public Sub onafterupdate(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onafterupdate
    
        End Sub
    
        Public Function onbeforeactivate(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.onbeforeactivate
            Return True
        End Function
    
        Public Function onbeforedeactivate(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.onbeforedeactivate
            Return True
        End Function
    
        Public Sub onbeforeeditfocus(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onbeforeeditfocus
    
        End Sub
    
        Public Function onbeforeupdate(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.onbeforeupdate
            Return True
        End Function
    
        Public Sub oncellchange(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.oncellchange
    
        End Sub
    
        Public Function onclick(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.onclick
            Return True
        End Function
    
        Public Function oncontextmenu(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.oncontextmenu
            Return True
        End Function
    
        Public Function oncontrolselect(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.oncontrolselect
            Return True
        End Function
    
        Public Sub ondataavailable(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.ondataavailable
    
        End Sub
    
        Public Sub ondatasetchanged(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.ondatasetchanged
    
        End Sub
    
        Public Sub ondatasetcomplete(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.ondatasetcomplete
    
        End Sub
    
        Public Function ondblclick(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.ondblclick
            Return True
        End Function
    
        Public Sub ondeactivate(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.ondeactivate
    
        End Sub
    
        Public Function ondragstart(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.ondragstart
            Return True
        End Function
    
        Public Function onerrorupdate(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.onerrorupdate
            Return True
        End Function
    
        Public Sub onfocusin(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onfocusin
    
        End Sub
    
        Public Sub onfocusout(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onfocusout
    
        End Sub
    
        Public Function onhelp(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.onhelp
            Return True
        End Function
    
        Public Sub onkeydown(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onkeydown
    
        End Sub
    
        Public Function onkeypress(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.onkeypress
            Return True
        End Function
    
        Public Sub onkeyup(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onkeyup
    
        End Sub
    
        Public Sub onmousedown(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onmousedown
    
        End Sub
    
        Public Sub onmousemove(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onmousemove
    
        End Sub
    
        Public Sub onmouseout(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onmouseout
    
        End Sub
    
        Public Sub onmouseover(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onmouseover
    
        End Sub
    
        Public Sub onmouseup(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onmouseup
    
        End Sub
    
        Public Function onmousewheel(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.onmousewheel
            Return True
        End Function
    
        Public Sub onpropertychange(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onpropertychange
    
        End Sub
    
        Public Sub onreadystatechange(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onreadystatechange
    
        End Sub
    
        Public Sub onrowenter(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onrowenter
    
        End Sub
    
        Public Function onrowexit(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.onrowexit
            Return True
        End Function
    
        Public Sub onrowsdelete(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onrowsdelete
    
        End Sub
    
        Public Sub onrowsinserted(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onrowsinserted
    
        End Sub
    
        Public Sub onselectionchange(ByVal pEvtObj As mshtml.IHTMLEventObj) Implements mshtml.HTMLDocumentEvents2.onselectionchange
    
        End Sub
    
        Public Function onselectstart(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.onselectstart
            Return True
        End Function
    
        Public Function onstop(ByVal pEvtObj As mshtml.IHTMLEventObj) As Boolean Implements mshtml.HTMLDocumentEvents2.onstop
            Return True
        End Function
    End Class
    
    Public Class IEEvents
        Implements SHDocVw.DWebBrowserEvents2
        Public fm As Form1
        Private icp As System.Runtime.InteropServices.UCOMIConnectionPoint
        Private cookie As Integer = -1
        Private m_ie As AxSHDocVw.AxWebBrowser
    
        Public Sub New(ByRef ie As AxSHDocVw.AxWebBrowser)
            ' Call QueryInterface for IConnectionPointContainer
            m_ie = ie
            Dim icpc As System.Runtime.InteropServices.UCOMIConnectionPointContainer = CType(ie.GetOcx(), System.Runtime.InteropServices.UCOMIConnectionPointContainer)
            ' Find the connection point for the
            ' DWebBrowserEvents2 source interface
            Dim g As Guid = GetType(SHDocVw.DWebBrowserEvents2).GUID
            icpc.FindConnectionPoint(g, icp)
    
            'Pass a pointer to the host to the connection point
            icp.Advise(Me, cookie)
    
            ' Show the browser
            ie.Visible = True
            Dim oURL As Object = "http://www.microsoft.com"
            Dim oEmpty As Object = ""
            ie.Navigate2(oURL, oEmpty, oEmpty, oEmpty, oEmpty)
    
        End Sub
    
    
        Public Sub BeforeNavigate2(ByVal pDisp As Object, ByRef URL As Object, ByRef Flags As Object, ByRef TargetFrameName As Object, ByRef PostData As Object, ByRef Headers As Object, ByRef Cancel As Boolean) Implements SHDocVw.DWebBrowserEvents2.BeforeNavigate2
    
        End Sub
    
        Public Sub ClientToHostWindow(ByRef CX As Integer, ByRef CY As Integer) Implements SHDocVw.DWebBrowserEvents2.ClientToHostWindow
    
        End Sub
    
        Public Sub CommandStateChange(ByVal Command As Integer, ByVal Enable As Boolean) Implements SHDocVw.DWebBrowserEvents2.CommandStateChange
    
        End Sub
    
        Public Sub DocumentComplete(ByVal pDisp As Object, ByRef URL As Object) Implements SHDocVw.DWebBrowserEvents2.DocumentComplete
            Dim doc As mshtml.HTMLDocument = CType(CType(pDisp, SHDocVw.IWebBrowser2).Document, mshtml.HTMLDocument)
            Dim pConPtCon As System.Runtime.InteropServices.UCOMIConnectionPointContainer = CType(doc, System.Runtime.InteropServices.UCOMIConnectionPointContainer)
            Dim guid As Guid = System.Type.GetType("mshtml.HTMLDocumentEvents2").GUID
            Dim pConPt As System.Runtime.InteropServices.UCOMIConnectionPoint
            pConPtCon.FindConnectionPoint(guid, pConPt)
            Dim d As IEHTMLDocumentEvents = New IEHTMLDocumentEvents
            pConPt.Advise(d, Form1.dwCookie2)
    
            Dim iEvent As mshtml.HTMLDocumentEvents2_Event
            iEvent = CType(doc, mshtml.HTMLDocumentEvents2_Event)
            AddHandler iEvent.onclick, AddressOf ClickEventHandler
            AddHandler iEvent.onmouseover, AddressOf MouseOverEventHandler
        End Sub
        Private Function ClickEventHandler(ByVal e As mshtml.IHTMLEventObj) As Boolean
            fm.add_list(e.type + ":" + e.srcElement.tagName)
            Return True
        End Function
        Private Sub MouseOverEventHandler(ByVal e As mshtml.IHTMLEventObj)
            fm.add_list(e.type + ":" + e.srcElement.tagName)
        End Sub
        Public Sub DownloadBegin() Implements SHDocVw.DWebBrowserEvents2.DownloadBegin
    
        End Sub
    
        Public Sub DownloadComplete() Implements SHDocVw.DWebBrowserEvents2.DownloadComplete
    
        End Sub
    
        Public Sub FileDownload(ByRef Cancel As Boolean) Implements SHDocVw.DWebBrowserEvents2.FileDownload
    
        End Sub
    
        Public Sub NavigateComplete2(ByVal pDisp As Object, ByRef URL As Object) Implements SHDocVw.DWebBrowserEvents2.NavigateComplete2
    
        End Sub
    
        Public Sub NavigateError(ByVal pDisp As Object, ByRef URL As Object, ByRef Frame As Object, ByRef StatusCode As Object, ByRef Cancel As Boolean) Implements SHDocVw.DWebBrowserEvents2.NavigateError
    
        End Sub
    
        Public Sub NewWindow2(ByRef ppDisp As Object, ByRef Cancel As Boolean) Implements SHDocVw.DWebBrowserEvents2.NewWindow2
    
        End Sub
    
        Public Sub OnFullScreen(ByVal FullScreen As Boolean) Implements SHDocVw.DWebBrowserEvents2.OnFullScreen
    
        End Sub
    
        Public Sub OnMenuBar(ByVal MenuBar As Boolean) Implements SHDocVw.DWebBrowserEvents2.OnMenuBar
    
        End Sub
    
        Public Sub OnQuit() Implements SHDocVw.DWebBrowserEvents2.OnQuit
    
        End Sub
    
        Public Sub OnStatusBar(ByVal StatusBar As Boolean) Implements SHDocVw.DWebBrowserEvents2.OnStatusBar
    
        End Sub
    
        Public Sub OnTheaterMode(ByVal TheaterMode As Boolean) Implements SHDocVw.DWebBrowserEvents2.OnTheaterMode
    
        End Sub
    
        Public Sub OnToolBar(ByVal ToolBar As Boolean) Implements SHDocVw.DWebBrowserEvents2.OnToolBar
    
        End Sub
    
        Public Sub OnVisible(ByVal Visible As Boolean) Implements SHDocVw.DWebBrowserEvents2.OnVisible
    
        End Sub
    
        Public Sub PrintTemplateInstantiation(ByVal pDisp As Object) Implements SHDocVw.DWebBrowserEvents2.PrintTemplateInstantiation
    
        End Sub
    
        Public Sub PrintTemplateTeardown(ByVal pDisp As Object) Implements SHDocVw.DWebBrowserEvents2.PrintTemplateTeardown
    
        End Sub
    
        Public Sub PrivacyImpactedStateChange(ByVal bImpacted As Boolean) Implements SHDocVw.DWebBrowserEvents2.PrivacyImpactedStateChange
    
        End Sub
    
        Public Sub ProgressChange(ByVal Progress As Integer, ByVal ProgressMax As Integer) Implements SHDocVw.DWebBrowserEvents2.ProgressChange
    
        End Sub
    
        Public Sub PropertyChange(ByVal szProperty As String) Implements SHDocVw.DWebBrowserEvents2.PropertyChange
    
        End Sub
    
        Public Sub SetSecureLockIcon(ByVal SecureLockIcon As Integer) Implements SHDocVw.DWebBrowserEvents2.SetSecureLockIcon
    
        End Sub
    
        Public Sub StatusTextChange(ByVal Text As String) Implements SHDocVw.DWebBrowserEvents2.StatusTextChange
    
        End Sub
    
        Public Sub TitleChange(ByVal Text As String) Implements SHDocVw.DWebBrowserEvents2.TitleChange
    
        End Sub
    
        Public Sub UpdatePageStatus(ByVal pDisp As Object, ByRef nPage As Object, ByRef fDone As Object) Implements SHDocVw.DWebBrowserEvents2.UpdatePageStatus
    
        End Sub
    
        Public Sub WindowClosing(ByVal IsChildWindow As Boolean, ByRef Cancel As Boolean) Implements SHDocVw.DWebBrowserEvents2.WindowClosing
    
        End Sub
    
        Public Sub WindowSetHeight(ByVal Height As Integer) Implements SHDocVw.DWebBrowserEvents2.WindowSetHeight
    
        End Sub
    
        Public Sub WindowSetLeft(ByVal Left As Integer) Implements SHDocVw.DWebBrowserEvents2.WindowSetLeft
    
        End Sub
    
        Public Sub WindowSetResizable(ByVal Resizable As Boolean) Implements SHDocVw.DWebBrowserEvents2.WindowSetResizable
    
        End Sub
    
        Public Sub WindowSetTop(ByVal Top As Integer) Implements SHDocVw.DWebBrowserEvents2.WindowSetTop
    
        End Sub
    
        Public Sub WindowSetWidth(ByVal Width As Integer) Implements SHDocVw.DWebBrowserEvents2.WindowSetWidth
    
        End Sub
    End Class
    
    

Catatan tambahan

  • Proses ini adalah sama jika Anda mengotomasi Internet Explorer. Ganti AxWebBrowser1 dengan nama variabel lokal untuk Internet Explorer.
  • Sampel ini tidak mempertimbangkan framesets. Ketika Anda menavigasi ke bingkai, Anda mungkin tidak melihat adanya peristiwa dalam aplikasi Anda. Jika diperlukan dalam aplikasi Anda, Anda harus menambahkan kode untuk menangani bingkai kemungkinan.

REFERENSI

Untuk informasi lebih lanjut tentang kontrol browser web, serta metode, properti, dan peristiwa-peristiwa yang WebBrowser kontrol mengekspos, merujuk pada dokumentasi MSDN berikut:
http://msdn2.Microsoft.com/en-us/library/Aa752043.aspx
Untuk informasi lebih lanjut tentang mengembangkan solusi berbasis Web untuk Microsoft Internet Explorer, kunjungi Website Microsoft berikut:
http://MSDN.Microsoft.com/IE/

http://support.microsoft.com/iep

Properti

ID Artikel: 311284 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Kata kunci: 
kbhowtomaster kbwebbrowser kbmt KB311284 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:311284

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com