Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di mvent
    Registrato dal
    Jun 2002
    Messaggi
    230

    [vb net/2012] Process.GetProcesses() non prende tutti i processi

    Ho un form con dentro un oggetto WebBrowser. Ho una routine che, ciclicamente, naviga per Internet con il WebBrowser prendendo i link e aprendoli, se soddisfano certi requisiti.
    Succede che durante questa navigazione automatica saltano fuori alcune FINESTRE di errore, ad esempio: "errore nello script", "errore nell'esecuzione della pagina", eccetera eccetera.
    quando saltano fuori questa finestrelle, il programma rimane in attesa che l'utente clicchi su queste finestre per chiuderle.
    Questo non va affatto bene perchè la ricerca dura alcune ore e non posso avere questi blocchi.
    così ho fatto questo codice di seguito codice per prendere tutti i processi e chiudere quelli che mi rompono le scatole. Ecco il codice:
    codice:
     Public Sub ChiudiFinestrelle()
            'Con questa procedura chiudo le varie finestrelle che si aprono durante l'esplorazione, come per 
            'esempio gli avvisi protezioni, gli errori di script, eccetera.
            Dim ProcessiAttivi As Process()
            Dim myProcess As Process
            ProcessiAttivi = Process.GetProcesses()   'prendo tutti i processi attivi
            For Each myProcess In ProcessiAttivi
                If InStr(1, LCase(myProcess.MainWindowTitle), "avviso di protezione", vbTextCompare) > 0 Then myProcess.CloseMainWindow()
                If InStr(1, LCase(myProcess.MainWindowTitle), "errore nello script", vbTextCompare) > 0 Then myProcess.CloseMainWindow()
                If InStr(1, LCase(myProcess.MainWindowTitle), "download del file", vbTextCompare) > 0 Then myProcess.CloseMainWindow()
                If InStr(1, LCase(myProcess.MainWindowTitle), "windows internet explorer", vbTextCompare) > 0 Then myProcess.CloseMainWindow()
                If InStr(1, LCase(myProcess.MainWindowTitle), "connetti a", vbTextCompare) > 0 Then myProcess.CloseMainWindow()
                If InStr(1, LCase(myProcess.MainWindowTitle), "windows media player", vbTextCompare) > 0 Then myProcess.CloseMainWindow()
                If InStr(1, LCase(myProcess.MainWindowTitle), "errore pagina web", vbTextCompare) > 0 Then myProcess.CloseMainWindow()
                If InStr(1, LCase(myProcess.MainWindowTitle), "ambiente di sviluppo", vbTextCompare) > 0 Then myProcess.CloseMainWindow()
                If InStr(1, LCase(myProcess.MainWindowTitle), "messaggio dalla pagina", vbTextCompare) > 0 Then myProcess.CloseMainWindow()
                If InStr(1, LCase(myProcess.MainWindowTitle), "prompt utente explorer", vbTextCompare) > 0 Then myProcess.CloseMainWindow()
            Next myProcess
        End Sub
    qual'è il problema? il problema è che non trova mai nessun processo con quei titoli di finestra e quindi non chiude un tubo.
    trova solo i processi che si vedono nel task manager di windows ma in tale lista non compaiono quelle FINESTRE "errore nello script", "avviso di protezione" e altre simili.

    Con il vb6 avevo un codice che mi pigliava veramente TUTTI i processi e riusciva a beccare e chiudere quelle finestre sgradite. Però non posso usarlo perché ci sono una trentina di Api che ho provato a riadattare in vb.net ma non ci sono riuscito.

    ho visto, nel debug, che ogni processo ha la proprietà "modules", la quale contiene un vettore con svariati moduli (dll). E' qui che devo spulciare per vedere se trovo quelle finestre di errore??
    E come faccio a chiudere solo un modulo e non tutto il processo?
    AIUTO!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Stai confondendo processi con finestre.

    Probabilmente in VB6 facevi l'elenco delle finestre aperte di Windows, non delle finestre principali dei vari processi, che sono un'altra cosa.

    Al posto di operare in questo modo, prova ad utilizzare il codice suggerito in

    http://msdn.microsoft.com/en-us/libr...uppressed.aspx
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di mvent
    Registrato dal
    Jun 2002
    Messaggi
    230
    Originariamente inviato da oregon
    Stai confondendo processi con finestre.

    Probabilmente in VB6 facevi l'elenco delle finestre aperte di Windows, non delle finestre principali dei vari processi, che sono un'altra cosa.

    Al posto di operare in questo modo, prova ad utilizzare il codice suggerito in

    http://msdn.microsoft.com/en-us/libr...uppressed.aspx
    Grazie 1.000, Oregon!

    Intanto ho anche trovato un metodo alternativo. L'ho provato e funziona alla stragrande. Lo pubblico, casomai a qualcuno potesse servire:

    codice:
        Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As EnumWindowsProcDelegate, ByVal lParam As Integer) As Integer
        Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer
        Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As Integer
        Delegate Function EnumWindowsProcDelegate(ByVal hwnd As IntPtr, ByVal lparam As Integer) As Boolean
        Public Declare Function DestroyWindow Lib "user32" (ByVal HWND As Integer) As Long
        Public numHWD As Long
    
    
     Public Sub ChiudiFinestrelle()
            Dim prova33 As Boolean
            numHWD = 0
            prova33 = EnumWindows(AddressOf EnumWindowsProc, &H0)
            If numHWD > 0 Then Call DestroyWindow(numHWD)
        End Sub
    
        Public Function EnumWindowsProc(ByVal HWND As Integer, ByVal lParam As Integer) As Boolean
            Dim sSaVe As String, RET As Integer
            RET = GetWindowTextLength(HWND)
            sSaVe = Space(RET)
            GetWindowText(HWND, sSaVe, RET + 1)
            If sSaVe.Trim <> "" Then
                If InStr(1, LCase(sSaVe), "avviso di protezione", vbTextCompare) > 0 Then numHWD = HWND
                If InStr(1, LCase(sSaVe), "errore nello script", vbTextCompare) > 0 Then numHWD = HWND
                If InStr(1, LCase(sSaVe), "download del file", vbTextCompare) > 0 Then numHWD = HWND
                If InStr(1, LCase(sSaVe), "windows internet explorer", vbTextCompare) > 0 Then numHWD = HWND
                If InStr(1, LCase(sSaVe), "connetti a", vbTextCompare) > 0 Then numHWD = HWND
                If InStr(1, LCase(sSaVe), "windows media player", vbTextCompare) > 0 Then numHWD = HWND
                If InStr(1, LCase(sSaVe), "errore pagina web", vbTextCompare) > 0 Then numHWD = HWND
                If InStr(1, LCase(sSaVe), "ambiente di sviluppo", vbTextCompare) > 0 Then numHWD = HWND
                If InStr(1, LCase(sSaVe), "messaggio dalla pagina", vbTextCompare) > 0 Then numHWD = HWND
                If InStr(1, LCase(sSaVe), "prompt utente explorer", vbTextCompare) > 0 Then numHWD = HWND
    
                If InStr(1, LCase(sSaVe), "aviso de segurança", vbTextCompare) > 0 Then numHWD = HWND
                If InStr(1, LCase(sSaVe), "erro de página da web", vbTextCompare) > 0 Then numHWD = HWND
                If InStr(1, LCase(sSaVe), "erro de script", vbTextCompare) > 0 Then numHWD = HWND
            End If
            EnumWindowsProc = True   'continua enumerazione
        End Function
    Inoltre, avevo trovato anche questo link, però non l'ho provato: http://www.a1vbcode.com/snippet-5324.asp
    Tuttavia potrebbe essere un utile approfondimento per l'argomento della discussione.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.