2013-04-22 10 views
13

Sto tentando di accedere alla cronologia delle applicazioni da C#. Vorrei presentare le stesse informazioni del task manager, ma non riesco a trovare API/esempio. Ovviamente implemento un'applicazione desktop.Cronologia delle applicazioni di Windows 8 taskmanager in C#

Per specificare il problema: non sono interessato a CPU/RAM. L'unica cosa che mi piacerebbe avere è il tempo.

AGGIORNAMENTO per mostrare esattamente quello che sto parlando un'occhiata a questa schermata: Screen shot

risposta

4

Ho fatto qualche ricerca su questo, perché ho trovato interessante il modo in cui le app della metropolitana si integrano nella struttura del processo esistente.

Come altre persone hanno indicato qui, non è possibile in un modo API supportato bello ottenere le informazioni desiderate. Tuttavia, ogni app viene avviata come un processo diverso e per i processi ci sono modi conosciuti per ottenere tempo di esecuzione, tempo di CPU ecc.

Se si trova il processo di corrispondenza all'app di Windows 8, sarà possibile ottenere il informazioni di cui hai bisogno.

Alcune app sono davvero facili da individuare. Sono solo un eseguibile come qualsiasi altra applicazione desktop con un processname e una descrizione corretti. Per esempio in questa immagine "Map", "Windows Reader" e "Microsoft Camera Application":

enter image description here

alcune altre applicazioni sono un po 'più difficili da individuare. Sono ospitati in un processo avviato dall'eseguibile wwahost.exe. Ho potuto solo individuare il nome dell'app guardando la lista dei moduli. Questa è l'applicazione Bing:

enter image description here

per enumerare i moduli e mappato i file da un processo è possibile utilizzare il WinAPIs VirtualQueryEx e GetMappedFileName.

Quindi si desidera cercare i file che si trovano a %programfiles%\WindowsApps. Questa è la cartella in cui Windows salva tutti i file dell'applicazione per le sue app.

Ogni app ha un file .pri. Questo file contiene metadati binari dell'applicazione. Potresti usarlo per trovare il nome dell'app dal processo che lo ospita. Nella stessa cartella con il file .pri c'è uno AppxManifest.xml in cui è possibile trovare tutti i tipi di informazioni aggiuntive sull'app.

Cercherò di riassumere la mia scrittura un po ':

  • processi di enumerare con WinAPI e ottenere tutte le informazioni che avete bisogno di (fase di esecuzione, il tempo di CPU, ecc).
  • enumerare i file mappati di ogni processo e cercare ressources.pri. La directory in cui si trova questo file ha il nome dell'app in esso.
  • come bonus leggere il file AppxManifest.xml per ulteriori informazioni sull'app. Potrebbe essere necessario il privilegio di amministratore o privilegi aggiuntivi per leggere questo file.
+0

Bella risposta! Quello sarebbe il meglio che può ottenere, ma non gli permetterà di ottenere il tempo CPU per ogni modulo che è l'informazione che sta cercando. Questo fornisce solo l'elenco di moduli o "Processi" –

+0

Con queste informazioni posso creare le mie statistiche che sono probabilmente le migliori che posso ottenere :) –

+0

Suppongo che anche il task manager di Windows 8 "solo" ottenga il tempo della CPU da il processo host dell'app. Poiché ogni app genera un nuovo processo, non vedo perché i valori dovrebbero differire. – typ1232

5

presumo da The only thing I would like to get is Time. si intende l'ora di inizio e fine di ogni processo

Il modo migliore sarà che dovrai costruirti quella storia. Se hai bisogno della cronologia solo quando la tua applicazione è in esecuzione, devi semplicemente implementare il codice qui sotto, altrimenti se desideri creare la cronologia per un certo periodo anche quando l'applicazione non funziona, prova a creare un servizio Windows che faccia il lavoro per te. Di seguito sono riportati i passi che devi fare a patto di saper come creare un progetto di servizio Windows, compilarlo ed installarlo:

Ottenere i processi in esecuzione informazioni:

using System; 
using System.Diagnostics; 

public static class ProcessStart 
{ 
    Process[] runningProcesses; 
    var processesStartTimes = new Dictionary<int, Datetime>(); 
    var processesExitTimes = new Dictionary<int, Datetime>(); 

    static ProcessStart() 
    { 
     // This will get current running processes 
     runningProcesses = Process.GetProcesses(); 
     foreach (var p in processes) 
     { 
      p.Exited += new EventHandler(ProcessExited); 
      processesStartTimes.Add(p.Id, p.StartTime); 
     } 
    } 

    private void ProcessExited(object sender, System.EventArgs e) 
    { 
     var p = (Process)sender; 
     processesExitTimes.Add(p.Id, p.ExitTime); 
    } 
} 

Come processi nuova iniziate

È necessario creare un nuovo oggetto Timer ed eseguirlo ogni secondo per verificare i nuovi processi creati. Ho copiato il codice di cui sopra e l'ha estesa:

public static class ProcessStart 
{ 
    Process[] runningProcesses; 
    var processesStartTimes = new Dictionary<int, Datetime>(); 
    var processesExitTimes = new Dictionary<int, Datetime>(); 
    var updateTimer = new Timer(1000); 

    static ProcessStart() 
    { 
     // This will get current running processes 
     runningProcesses = Process.GetProcesses(); 
     foreach (var p in processes) 
     { 
      p.Exited += new EventHandler(ProcessExited); 
      processesStartTimes.Add(p.Id, p.StartTime); 
     } 
     updateTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
    } 

    private void ProcessExited(object sender, System.EventArgs e) 
    { 
     var p = (Process)sender; 
     processesExitTimes.Add(p.Id, p.ExitTime); 
    } 

    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     runningProcesses = Process.GetProcesses(); 
     foreach (var p in processes) 
     { 
      // This will only add the processes that are not added yet 
      if (!processesStartTimes.Keys.Contains(p.Id)) 
      { 
       p.Exited += new EventHandler(ProcessExited); 
       processesStartTimes.Add(p.Id, p.StartTime); 
      } 
     } 
    } 
} 

Infine:

È proprio in quel momento bisogno di giocare con la classe System.Diagnostics.Process. Questo dovrebbe essere il modo migliore per ottenere tutte le informazioni necessarie sui processi di Windows. Vi garantirà l'accesso a una vasta gamma di proprietà e metodi. Ecco l'MSDN lik ufficiale per esso:

Process Class

EDIT:

Come posso vedere dal tuo commento, siete interessati a tempo CPU hanno trascorso l'esecuzione di un processo specifico. La stessa classe System.Diagnostics.Process contiene anche queste informazioni. Questo può essere trovato usando la proprietà Process.PrivilegedProcessorTime. La descrizione MSDN per questa proprietà è:

Un TimeSpan che indica il tempo impiegato dal processo per eseguire il codice all'interno del core del sistema operativo.

Maggiori informazioni Here

EDIT 2:

I 2 Beni seguenti potrebbero anche dare probabilmente quello che vi serve:

Process.UserProcessorTime: Here

un periodo che indica la quantità di tempo che il processo associato ha trascorso in esecuzione codice all'interno della parte dell'applicazione del processo (non all'interno del core del sistema operativo).

Process.TotalProcessorTime: Here

un periodo che indica la quantità di tempo che il processo associato ha speso utilizzando la CPU. Questo valore è la somma di UserProcessorTime e PrivilegedProcessorTime.

+0

Hai frainteso la mia domanda. Voglio presentare le stesse informazioni del task manager di Windows 8. Stavo parlando di questa funzionalità: http://cdn3.pcadvisor.co.uk/cmsdata/features/3422276/Win8-Task-Manager-2.jpg Inoltre, tutto Le app Metro in Windows 8 sono ospitate in un processo chiamato wwahost –

+0

Fare del mio meglio per comprendere i risultati della prima riga in un voto negativo? Humm .. interessante –

+0

solo nella foto che hai fornito: dove vedi un 'Tempo 'dovunque? –

7

Nella descrizione delle domande mancano i dettagli di cui si sta parlando in Metro App. La soluzione sarebbe equivalente a Process.TotalProcessorTime ma per le app Metro.

Sfortunatamente, non è possibile ottenere tali informazioni perché, come dichiarato, le applicazioni sono in esecuzione in un altro processo (WWAHost.exe). Il design di Metro è un po 'più simile al telefono: non è possibile manipolare direttamente il sistema allo stesso modo. Non esiste un "Processo" direttamente in Windows Runtime (vedi here), che a sua volta significa che la classe Process non avrebbe senso per port ...

+0

Per questa risposta dovrei darti -1. Se è impossibile come lo fa il task manager. Hai ragione che è impossibile da WinRT ma deve essere possibile da WinApi. La mia domanda è stata contrassegnata da Windows 8 e ho scritto sulla cronologia delle applicazioni e sul task manager. Hai ragione che mancava il link all'immagine, ma entrambe le risposte sono errate –

+1

Ho fatto del mio meglio per aiutarti. Se qualcosa non è possibile ciò non significa necessariamente che la risposta è sbagliata. Ho incluso i riferimenti e ho trascorso parecchio tempo cercando di capire una soluzione e queste sono le risposte che ho trovato. Ci scusiamo per non aver fornito una soluzione all'altezza delle tue aspettative. –

+0

Ma è possibile perché il task manager mostri queste informazioni. Posso capire che Microsoft nasconde questa API ma la usano –

10

Non esiste un modo supportato per ottenere queste informazioni. Scusate.

+0

Che dire di non supportato? –

+10

No. Non ti permetterò di rovinare i tuoi clienti facendo qualcosa di non supportato. –

Problemi correlati