[Vb.net 2010] Aiuto creazione tack manager personalizzato

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
31
sevenjeak.altervista.org
Sto, in questi giorni, per provare alcune funzionalità, provando a creare un tasck manager, come quello di windows, ma con alcuni cambiamenti, questo tasck manager, per ora, a due schede, la scheda Applicazione contenente una listview con tutti i processi con l'handle diverso da 0, insomma tutti quelli che creano un'interfaccia grafica visibile su schermo, ed il loro responde, mentre nell'altra scheda, la scheda Processi, una listview contenente tutti i processi, per ogni processo o il suo id, il nome, il proprietario ( da chi è stato eseguito il processo ) è la locazione sul disco ( recuperata tramite l'istruzione istanza_processo.MainModule.FileName ).

Prima di completare questa applicazione mi servono alcuni chiarimenti / aiuto, che ho provato a cercare su internet ma purtroppo non ho risolto:

  1. Dovrei aggiornare le due liste, contenente nella prima e nella seconda scheda, in tempo reale, non credo vada bene aggiornarla con un timer, visto che, quando si aggiorna, l'elemento della lista selezionato mi perde la selezione, quindi, presumo si faccia in altro modo?
  2. 2. nella prima scheda, quando ho aperta una qualsiasi cartella il nome dell'applicazione non mi esce ( il processo corrisponde a explorer.exe ), come potrei fare a far scrivere, in questo caso, il percorso aperto dall'esprola risorse ( non so se mi spiego )
  3. Nella lista processo ho la colonna proprietario ( chi esegue il processo ), come faccio a recuperare questa informazione

Se vi occorre, entrambi le liste, sia quella per visualizzare le applicazione, che quella per i processi, li genero, per ora, all'avvio dell'applicazione con questo codice:

Codice:
ListView1.Columns.Add("ID", 0)
        ListView1.Columns.Add("Operazione", 299)
        ListView1.Columns.Add("Stato", 100)

        ListView2.Columns.Add("ID")
        ListView2.Columns.Add("Nome immagine", 150)
        ListView2.Columns.Add("Proprietario", 80)
        ListView2.Columns.Add("Locazione sul disco", 200)

        Dim p() As Process = System.Diagnostics.Process.GetProcesses
        Dim appItems, prcItems, prcResponse
        Dim icons As Icon
        Dim imList As New ImageList()

        count_process = 0

        For Each pr As Process In p
            If pr.Responding = True Then
                prcResponse = New String("In eseguzione..")
            Else
                prcResponse = New String("Non risponde.")
            End If


            If pr.MainWindowHandle <> 0 And pr.ProcessName <> "explorer" Then
                appItems = New ListViewItem({pr.Id, pr.MainWindowTitle, prcResponse})
                'icons = Icon.ExtractAssociatedIcon()

                ListView1.Items.Add(appItems)
            End If

            Try
                prcItems = New ListViewItem({pr.Id, pr.ProcessName, "-", pr.MainModule.FileName})
            Catch
                prcItems = New ListViewItem({pr.Id, pr.ProcessName, "-", "-"})
            End Try

            ListView2.Items.Add(prcItems)

            prcResponse = Nothing
            icons = Nothing
            count_process += 1
        Next
Ah.. quasi dimenticavo, è possibile recuperare l'icona prodotta dal processo per poi metterla negli item presente nella prima lista? ho già provato in vari modo, ora purtroppo non ricordo come, ma senza alcun risultato.
 

Vins

Moderatore
Membro dello Staff
MOD
28 Lug 2009
238
19
0
Ciao,

per quanto riguarda l'aggiornamento delle liste credo che l'utilizzo di un timer sia la scelta giusta.
Ad esempio, potresti impostare un timer che scatta ad intervalli di un secondo e aggiorna la lista.
Per l'elemento correntemente selzionato puoi memorizzarne i riferimenti prima del refresh e poi riselezionarlo nella lista aggiornata.
 

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
31
sevenjeak.altervista.org
Come scritto nel mio primo punto il time lo utilizzato, ma il problema è questo, sicuro che non esiste un'altro metodo, visto che nel task manager di windows non si nota per niente che la lista si ricrea, almeno da quello che ho notato io.

Per il problema della selezione ci proverò, grazie.

Mentre per quando riguarda l'altri punti?
 

Vins

Moderatore
Membro dello Staff
MOD
28 Lug 2009
238
19
0
Infatti io non ho detto di ricreare la lista, ma di aggiornarla. In pratica dovresti caricarti separatamente la lista dei processi ad ogni tick del timer e poi crearti una routine che in base all'id del processo vada ad aggiornare solo i processi i cui valori sono effettivamente cambiati.

Per quanto riguarda le altre due cose puoi utilizzare gli oggetti ShellWindows o EnumDesktopWindows. Di seguito i link alla documentazione ufficiale Microsoft:

http://msdn.microsoft.com/en-us/library/bb773974(VS.85).aspx
http://msdn.microsoft.com/it-it/library/windows/desktop/ms682615(v=vs.85).aspx
 
Ultima modifica:

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
31
sevenjeak.altervista.org
Ok grazie, cercherò, non appena avrò tempo di modificare il mio programma.