none
Uygulamalarin başlama ve bitişlerini yakalamanın kolay bir yolu var mi? RRS feed

  • Soru

  • Bir uygulamam var, calistirildiktan sonra minimize olup kenarda duracak. O kenarda iken, calistirilan veya sonlandirilan uygulamaların, baslangic\bitis zamanlarını kaydetmek istiyorum o kadar. Yani:

    public class AppInfo
    {
            public int pid { get; set; }
            public string Application { get; set; }
            public DateTime StartTime { get; set; }
            public DateTime EndTime { get; set; }
    }
    List<AppInfo> apps = new List<AppInfo>();
    
    private void AppStarted(...) {
       apps.Add( new AppInfo {...} );
    }
    
    private void AppFinished(...) {
      // app exists? Update
      // else 
      // apps.Add( new AppInfo {...} );
    }
    


    gibi bir şey yapmaya calisiyorum ama yapamadım.

    Mac'te bu is çok kolay, dogrudan bir iki event'i izlemeye başlıyorsunuz oluyor, windows'da kolay yapacagimi sandim ama yanilmisim :(

    Bulduklarimdan birisi ManagementEventWatcher kullanmak, ama ne yazık ki kullanici seviyesinin arttirilmasi gerekiyor. 

    easyhook diye bir şey buldum ama henüz anlayamadım. Bu is icin kullanan varsa ve kodlarını paylaşırsa sevinirim.

    Sonunda hiç istemediğim, bir timer ile process listesini alıp, öncekilerle kıyaslayarak, eklenenleri, cikanlari vs bulmak (eklenenleri bulunca onların Exited eventini de kullanabilirim belki).

    Sonunda bu process listesine kalırsam, icinden hangilerinin demon, TSR hangilerinin ana uygulama olduğunu bulmanın yolunu bilen varsa ve paylaşırsa sevinirim.

    Tesekkurler.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    12 Kasım 2019 Salı 16:48
    Yanıtlayıcı

Yanıtlar

  • Daha kolay bir yol bulamadigim icin timer ile process listesini aralıklarla alarak çözdüm (inefektif filan ama gayet güzel calisiyor, yeterli).

    Konuyu kapatmak adına, LinqPad ornegini verip, cevap olarak işaretliyorum.

    private static Timer timer;
    private static List<Proc> procs = new List<Proc>();
    
    static void Main(string[] args)
    {
    	var timerState = new TimerState
    	{
    		Counter = 0,
    		ProcessList = Process.GetProcesses()
    			.Where(p => !string.IsNullOrEmpty(p.MainWindowTitle))
    			.Select(p => new Proc { Pid = p.Id, Application = p.ProcessName, StartTime = p.StartTime })
    	};
    
    	timer = new Timer(
    		callback: new TimerCallback(TimerTask),
    		state: timerState,
    		dueTime: 1000,
    		period: 10000);
    
    	while (timerState.Counter <= 10)
    	{
    		Task.Delay(1000).Wait();
    	}
    
    	timer.Dispose();
    	Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.");
    	procs.Dump($"{DateTime.Now:HH:mm:ss.fff}");
    
    }
    
    private static void TimerTask(object timerState)
    {
    	var state = timerState as TimerState;
    	var current = Process.GetProcesses()
    			.Where(p => !string.IsNullOrEmpty(p.MainWindowTitle))
    			.Select(p => new Proc { Pid = p.Id, Application = p.ProcessName, StartTime = p.StartTime });
    	var previous = state.ProcessList;
    	// New apps
    	var newApps = current.Where(c => !previous.Any(p => p.Pid == c.Pid));
    	procs.AddRange(newApps);
    	// Finished apps
    	var finishedApps = previous.Where(p => !current.Any(c => c.Pid == p.Pid));
    	foreach (var app in finishedApps)
    	{
    		var pr = procs.SingleOrDefault(p => p.Pid == app.Pid);
    		if (pr != null)
    		{
    			pr.EndTime = DateTime.Now;
    		}
    		else
    		{
    			procs.Add(new Proc {Pid=app.Pid, Application=app.Application, StartTime = app.StartTime, EndTime = DateTime.Now});
    		}
    	}
    	
    	state.ProcessList = current;	
    	Interlocked.Increment(ref state.Counter);
    	
    	procs.Dump($"{DateTime.Now:HH:mm:ss.fff}");
    }
    
    class TimerState
    {
    	public int Counter;
    	public IEnumerable<Proc> ProcessList { get; set; }
    }
    
    public class Proc
    { 
    	public int Pid { get; set; }
    	public string Application { get; set; }
    	public DateTime? StartTime { get; set; }
    	public DateTime? EndTime { get; set; }
    }



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    13 Kasım 2019 Çarşamba 15:54
    Yanıtlayıcı

Tüm Yanıtlar

  • @CetinBasoz'den 

    gibi bir şey yapmaya calisiyorum ama yapamadım.

    Diye bir cümle de gördü ya bu gözler, tamamdır yazılım biliminin en dip imkansız noktasındayız demektir...

    Israrla "yok canım başka bir mesaj var ve @CetinBasoz cevap yazıyor konuya" diye mouse'un tekerleğini aşağı yukarı kaydırıp duruyorum...

    • Düzenleyen XentoX 12 Kasım 2019 Salı 21:00
    12 Kasım 2019 Salı 20:58
  • @CetinBasoz'den 

    gibi bir şey yapmaya calisiyorum ama yapamadım.

    Diye bir cümle de gördü ya bu gözler, tamamdır yazılım biliminin en dip imkansız noktasındayız demektir...

    Israrla "yok canım başka bir mesaj var ve @CetinBasoz cevap yazıyor konuya" diye mouse'un tekerleğini aşağı yukarı kaydırıp duruyorum...

    Abartmissin :)

    Benim hatam, Windows'un biraz da olsa Mac OSX isletim sistemine yaklasabildigini, ve Mac icin kod yazdigimin en az 15-20 kati kadar windows'a yazdigimdan, daha kolay olacagini, bu tip islerin isletim sistemi ve .Net kütüphaneleriyle, hadi olmadı win32 API ile çözülebileceğini sanmak oldu.

    Megerse Mac harikaymış, yazilimcilara da çok daha fazla yardim ediyormuş.

    Yani icimden, kirk yılda bir WMI ile de olsa, ise yarar bir event sistemi yapmişsiniz, hangi akla hizmet bunu kullanmak icin administrator yetkisi istiyorsunuz diye kufretmek gecti.

    Sonucta, pasa pasa 20 yıl once çözdüğümüz yöntemle halleneceğim anlaşılan (timer ile o an calisan processlerin listesini alıp, varsa, bir öncekiyle kıyaslayıp yeni eklenen ya da bitenleri tespit etme. Event ile olsa iyi olurdu.)



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    13 Kasım 2019 Çarşamba 14:44
    Yanıtlayıcı
  • Daha kolay bir yol bulamadigim icin timer ile process listesini aralıklarla alarak çözdüm (inefektif filan ama gayet güzel calisiyor, yeterli).

    Konuyu kapatmak adına, LinqPad ornegini verip, cevap olarak işaretliyorum.

    private static Timer timer;
    private static List<Proc> procs = new List<Proc>();
    
    static void Main(string[] args)
    {
    	var timerState = new TimerState
    	{
    		Counter = 0,
    		ProcessList = Process.GetProcesses()
    			.Where(p => !string.IsNullOrEmpty(p.MainWindowTitle))
    			.Select(p => new Proc { Pid = p.Id, Application = p.ProcessName, StartTime = p.StartTime })
    	};
    
    	timer = new Timer(
    		callback: new TimerCallback(TimerTask),
    		state: timerState,
    		dueTime: 1000,
    		period: 10000);
    
    	while (timerState.Counter <= 10)
    	{
    		Task.Delay(1000).Wait();
    	}
    
    	timer.Dispose();
    	Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.");
    	procs.Dump($"{DateTime.Now:HH:mm:ss.fff}");
    
    }
    
    private static void TimerTask(object timerState)
    {
    	var state = timerState as TimerState;
    	var current = Process.GetProcesses()
    			.Where(p => !string.IsNullOrEmpty(p.MainWindowTitle))
    			.Select(p => new Proc { Pid = p.Id, Application = p.ProcessName, StartTime = p.StartTime });
    	var previous = state.ProcessList;
    	// New apps
    	var newApps = current.Where(c => !previous.Any(p => p.Pid == c.Pid));
    	procs.AddRange(newApps);
    	// Finished apps
    	var finishedApps = previous.Where(p => !current.Any(c => c.Pid == p.Pid));
    	foreach (var app in finishedApps)
    	{
    		var pr = procs.SingleOrDefault(p => p.Pid == app.Pid);
    		if (pr != null)
    		{
    			pr.EndTime = DateTime.Now;
    		}
    		else
    		{
    			procs.Add(new Proc {Pid=app.Pid, Application=app.Application, StartTime = app.StartTime, EndTime = DateTime.Now});
    		}
    	}
    	
    	state.ProcessList = current;	
    	Interlocked.Increment(ref state.Counter);
    	
    	procs.Dump($"{DateTime.Now:HH:mm:ss.fff}");
    }
    
    class TimerState
    {
    	public int Counter;
    	public IEnumerable<Proc> ProcessList { get; set; }
    }
    
    public class Proc
    { 
    	public int Pid { get; set; }
    	public string Application { get; set; }
    	public DateTime? StartTime { get; set; }
    	public DateTime? EndTime { get; set; }
    }



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    13 Kasım 2019 Çarşamba 15:54
    Yanıtlayıcı