HOW TO: Rilevare se un'applicazione è bloccata con Visual Basic .NET

Nel presente articolo viene illustrata una versione beta di un prodotto Microsoft. Le informazioni contenute in questo articolo vengono fornite "nello stato in cui si trovano" e sono soggette a modifiche senza preavviso.

Per questo prodotto beta Microsoft non fornisce alcun tipo di supporto formale. Per informazioni su come ottenere supporto per una versione beta, consultare la documentazione fornita con i file del prodotto beta oppure visitare il sito Web da cui la versione del prodotto è stata scaricata.

Sommario

In alcune situazioni può essere utile verificare se un'applicazione è bloccata. Se si automatizza ad esempio Microsoft Internet Explorer, è possibile verificare se Internet Explorer non risponde più.


In questo articolo viene illustrato come rilevare se un'istanza automatica di Internet Explorer non risponde più (è bloccata) e come chiudere Internet Explorer. Sebbene il codice si riferisca a Internet Explorer e Visual Basic .NET, è possibile utilizzare un approccio analogo per altre applicazioni.


Nelle prime tre sezioni di questo articolo sono illustrati tre importanti concetti di codifica necessari per svolgere questa attività. Nella quarta sezione viene dimostrato come compilare l'applicazione di esempio.


Avviare l'applicazione

Nell'esempio riportato in questo articolo viene utilizzata l'applicazione Internet Explorer. Il codice riportato di seguito avvia Internet Explorer e utilizza il metodo GetProcessByName per ottenere un handle al processo.
    Browser = New InternetExplorer()
Browser.Visible = True
Browser.GoHome()
procs = Process.GetProcessesByName("IEXPLORE")

Stabilire se l'applicazione risponde

Il codice riportato di seguito verifica il primo elemento della matrice procs, restituito dal metodo GetProcessByName, per stabilire se il processo risponde. In questo articolo si presume che sia in esecuzione una sola istanza di Internet Explorer. È necessario utilizzare il blocco try-catch per gestire l'eccezione che viene generata se il processo non esiste.
    Try
If procs(0).Responding = True Then
MessageBox.Show("IEXPLORE is responding")
Else
MessageBox.Show("IEXPLORE is not responding")
End If
Catch
MessageBox.Show("IEXPLORE is not running")
End Try

Chiudere l'applicazione

Il codice riportato di seguito dimostra come chiudere l'applicazione. Se l'applicazione risponde ancora, è possibile utilizzare il metodo CloseMainWindows della classe Process per chiuderlo. Se l'applicazione non risponde, è necessario chiamare il metodo Kill.
    Try
If procs(0).Responding Then
procs(0).CloseMainWindow()
Else
'Force closure.
procs(0).Kill()
End If

Catch notRunning As Exception When Err.Number = 91
MessageBox.Show("Could Not Find the IEXPLORE Process")

End Try

Compilare il progetto di esempio

Informazioni sul progetto di esempio

Il progetto di esempio di questo articolo è costituito da un modulo che contiene i tre pulsanti seguenti:
  • Start Internet Explorer, che utilizza l'automazione per avviare un'istanza di Internet Explorer.
  • Check Internet Explorer, che controlla se il browser risponde.
  • Close Internet Explorer, che chiude il browser.
Se si desidera testare il codice e si è conoscenza di una pagina Web che provoca il blocco del browser, è possibile visualizzare tale pagina dopo aver aperto il browser. Provare quindi a fare clic sui pulsanti Check Internet Explorer e Close Internet Explorer. Attendere qualche minuto dopo avere fatto clic sui pulsanti. La risposta non è immediata quando il browser non risponde.


Procedura per compilare il progetto di esempio

  1. Avviare una nuova applicazione Windows Visual Basic in Visual Basic .NET.
  2. Nella finestra Solution Explorer fare clic con il pulsante destro del mouse su References, quindi scegliere Add Reference.
  3. Nella scheda COM della finestra di dialogo Add Reference fare clic su Microsoft Internet Controls, quindi scegliere Select.
  4. Scegliere OK per chiudere la finestra di dialogo Add Reference.
  5. Nella finestra Solution Explorer fare clic con il pulsante destro del mouse su Forml.vb, quindi scegliere View Code.
  6. Eliminare tutto il codice dalla finestra del codice Form1.vb.
  7. Incollare nella finestra del codice Form1.vb il codice riportato di seguito:
    Option Explicit On 
    Option Strict On
    Imports SHDocVw

    Public Class Form1
    Inherits System.Windows.Forms.Form

    #Region" Windows Form Designer generated code "

    Public Sub New()
    MyBase.New()

    'This call is required by the Windows Form Designer.
    InitializeComponent()

    'Add any initialization after the InitializeComponent() call.

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
    If disposing Then
    If Not (components Is Nothing) Then
    components.Dispose()
    End If
    End If
    MyBase.Dispose(disposing)
    End Sub
    Friend WithEvents btnStart As System.Windows.Forms.Button
    Friend WithEvents btnCheck As System.Windows.Forms.Button
    Friend WithEvents btnClose As System.Windows.Forms.Button

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.Container

    ' NOTE: The following procedure is required by the Windows Form Designer.
    'You can use the Windows Form Designer to modify it; however, do not
    'use the code editor to modify it.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    Me.btnClose = New System.Windows.Forms.Button()
    Me.btnStart = New System.Windows.Forms.Button()
    Me.btnCheck = New System.Windows.Forms.Button()
    Me.SuspendLayout()
    '
    'btnClose
    '
    Me.btnClose.Location = New System.Drawing.Point(66, 176)
    Me.btnClose.Name = "btnClose"
    Me.btnClose.Size = New System.Drawing.Size(160, 23)
    Me.btnClose.TabIndex = 2
    Me.btnClose.Text = "Close Internet Explorer"
    '
    'btnStart
    '
    Me.btnStart.Location = New System.Drawing.Point(66, 72)
    Me.btnStart.Name = "btnStart"
    Me.btnStart.Size = New System.Drawing.Size(160, 23)
    Me.btnStart.TabIndex = 0
    Me.btnStart.Text = "Start Internet Explorer"
    '
    'btnCheck
    '
    Me.btnCheck.Location = New System.Drawing.Point(66, 124)
    Me.btnCheck.Name = "btnCheck"
    Me.btnCheck.Size = New System.Drawing.Size(160, 23)
    Me.btnCheck.TabIndex = 1
    Me.btnCheck.Text = "Check Internet Explorer"
    '
    'Form1
    '
    Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
    Me.ClientSize = New System.Drawing.Size(292, 266)
    Me.Controls.AddRange(New System.Windows.Forms.Control() _
    {Me.btnClose, Me.btnCheck, Me.btnStart})
    Me.Name = "Form1"
    Me.Text = "Form1"
    Me.ResumeLayout(False)

    End Sub

    #End Region

    Private WithEvents Browser As InternetExplorer
    Private procs() As Process

    Private Sub btnStart_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles btnStart.Click
    Me.Cursor.Current = Cursors.WaitCursor
    Browser = New InternetExplorer()
    Browser.Visible = True
    Browser.GoHome()
    procs = Process.GetProcessesByName("IEXPLORE")
    End Sub

    Private Sub btnCheck_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles btnCheck.Click
    'This code assumes that only one instance of Internet Explorer is running.
    Me.Cursor.Current = Cursors.WaitCursor

    Try
    If procs(0).Responding = True Then
    MessageBox.Show("IEXPLORE is responding")
    Else
    MessageBox.Show("IEXPLORE is not responding")
    End If
    Catch
    MessageBox.Show("IEXPLORE is not running")
    End Try
    End Sub

    Private Sub btnClose_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles btnClose.Click
    Me.Cursor.Current = Cursors.WaitCursor
    Try
    If procs(0).Responding Then
    procs(0).CloseMainWindow()
    Else
    procs(0).Kill()
    cleanUp()
    End If

    Catch notRunning As Exception When Err.Number = 91
    MessageBox.Show("Could Not Find the IEXPLORE Process")
    Catch lockedUp As Exception When Err.Number = -2147023170
    'Do nothing.
    End Try
    End Sub


    Private Sub Browser_OnQuit() Handles Browser.OnQuit
    'Clean up if the browser is closed manually.
    cleanUp()
    End Sub

    Private Sub cleanUp()
    ReDim procs(0)
    Browser = Nothing
    End Sub

    End Class
    NOTA: il codice precedente disegna, posiziona e attribuisce automaticamente un nome ai tre pulsanti del modulo ed evita pertanto di doverli aggiungere manualmente.
  8. Dopo aver incollato il codice nella finestra del codice Form1.vb, è possibile comprimere la regione denominata
    Windows Form Designer generated code.
  9. Premere F5 per compilare ed eseguire il progetto.
  10. Mentre Internet Explorer è in esecuzione, fare clic sui pulsanti del modulo per testare il codice.
RIFERIMENTI : Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito (gli articoli con prefisso "Q" contengono informazioni in inglese):

304991 HOW TO: Rilevare se un'applicazione è bloccata con C#
Proprietà

ID articolo: 304990 - Ultima revisione: 11 nov 2001 - Revisione: 1

Feedback