none
WPF ile Autohotkey gibi script yazmak RRS feed

  • Soru

  • WPF ile bir program yazıyorum. Autohotkey ile çok basit bir şekilde yapılabilecek bir olayı nasıl yapacağımı bilmiyorum. Programı açtığımızda otomatik olarak başka bir programın "örnek.exe" çalışmasını bekleyecek. Bu program kapandığında belirli işlemler yapacak. Örnek vermek gerekirse;

    dosyayolu = "Documents\LeagueofLegends\Screenshots"
    
    Loop {
      //Burada çalışacak programı bekliyor
      WinWait LeagueofLegends.exe
     
      filename:="newscreenshots"
      //Burada programın kapanmasını bekliyor
      WinWaitClose LeagueofLegends.exe
      //program kapanınca işlemi yapıyor
      FileCopy, dosyayolu, Documents\filename
     
    }

    Bu işlemi C# WPF ile nasıl yapabilirim? Programa autohotkey.dll eklemek istemiyorum.

    29 Mart 2020 Pazar 09:41

Yanıtlar

  • Öncelikle bu iş için bir event handler kullanmak gerek (döngüler vs performans açısından iyi bir seçim olmayabilir). Neyin eventini dinleyeceğiz? ManagementEventWatcher sınıfının EventArrived eventini dinleyeceğiz. Bu sayede hem uygulamaların başladığını hem de kapatıldığını/durduğunu anlayabileceğiz ama yönetici haklarıyla projeni çalıştırman gerek yoksa erişim hatası alırsın.

    Projeni yönetici olarak başlatmaya zorlamak için projeye Sağ tık> Add> New Item> Application Manifest... dosyasını ekliyoruz. Sonra açılan dosya içinden şu satırı bul,

    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

    ve şununla değiştir.

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

    Şimdi F5 yaptığında VS sana yönetici olarak açıp açmayacağını soracak, tamam deyip yeniden başlat. Artık projen yönetici olarak açılacak.

    Gelelim esas olaya, 2 tane ManagementEventWatcher değişkeni oluşturalım. Biri başlayan uygulamaları izlerken diğeri de kapananları izleyecek. Ayrıca hedef exe isminin tutulduğu bir string değişken daha oluşturalım.

    public ManagementEventWatcher processStartEvent { get; set; }
    public ManagementEventWatcher processStopEvent { get; set; }
    public string ExeFileName { get; set; }

    Window'un loaded eventinde iki farklı event için sorguları gönderip hedef uygulamayı belirtip izlemeye başlayalım.

    private void Window_Loaded(object sender, RoutedEventArgs e) { var processStartTrace = new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"); processStartEvent = new ManagementEventWatcher(processStartTrace); processStartEvent.EventArrived += new EventArrivedEventHandler(ProcessStartEvent_EventArrived); var processStopTrace = new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace"); processStopEvent = new ManagementEventWatcher(processStopTrace); processStopEvent.EventArrived += new EventArrivedEventHandler(ProcessStopEvent_EventArrived); processStartEvent.Start(); processStopEvent.Start();

    // bu kısımda izleyeceğin exe'yi yazıyorsun ExeFileName = "myTube.exe"; }

    Bunlarda handler'larımız. Burada artık ne yapacağın sana kalmış.
    /// <summary>
    /// Process start handler
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void ProcessStartEvent_EventArrived(object sender, EventArrivedEventArgs e)
    {
        if (e.NewEvent.Properties["ProcessName"].Value.ToString() == ExeFileName)
        {
            // hedef process başladığında yapılacaklar
        }
    }
    
    /// <summary>
    /// Process stop handler
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void ProcessStopEvent_EventArrived(object sender, EventArrivedEventArgs e)
    {
        if (e.NewEvent.Properties["ProcessName"].Value.ToString() == ExeFileName)
        {
            // hedef process durduğunda yapılacaklar
        }
    }

    Uyarı: Karşıdaki uygulamanın nasıl çalıştığından emin değilsel bu eventler seni yanıltabilir. Örneğin ben tarayıcıyı izlemek istiyorum, tarayıcı.exe'nin sub process'leri de var ve onlar da tarayıcı.exe olarak göreceğim. Açılan her sekme veya arkada yürütülen her ayrı process'i de hesaba katmak lazım.

    Proje dosyaları burada.


    TR| Sorunuzun yanıtı bu ise "Yanıt Olarak Öner" olarak işaretleyin, eğer faydalı bir yorum ise "Oy Ver"erek forumun işleyişine katkıda bulunabilirsiniz. EN| If this is the answer to your problem, mark "Propose as Answer" and if it is helpful, you can contribute to the workig of the forum by "Voting".


    • Düzenleyen Egoist Developer 29 Mart 2020 Pazar 12:12 yazım hatası düzeltme
    • Yanıt Olarak Öneren revanch 29 Mart 2020 Pazar 18:46
    • Yanıt Olarak İşaretleyen Erdil 30 Mart 2020 Pazartesi 20:23
    29 Mart 2020 Pazar 12:08