C# Sistem Olayları (SystemEvents)

C# ile geliştirdiğimiz uygulamalarda, işletim sistemi seviyesinde oluşan bazı olayları yakalamamız ve bu olaylarla ilgili kodlar yazmamız gerekebilir.

Örneğin, kullanıcı Windows oturumunu kapatırken, biz de uygulamamızı kapatmak veya şifre korumasını aktif hale getirmek isteyebiliriz.

Veya, kullanıcı Windows oturumunu kapattığında hala çalışmakta olan uygulamamızın belirli durumları loglamasını ve kullanıcı oturumunu geri açtığında bu logları kullanıcıya göstermeyi isteyebiliriz.

Kullanıcının, kendi ayarlarını değiştirmesinden, ekran çözünürlüğünü değiştirmesine kadar, çeşitli işletim sistemi olaylarını C# ile yakalayabilir ve ilgili olaylara kod yazabiliriz.

Öncelikle Microsoft.Win32 namespace‘ini kodumuzun using kısmına ekleyelim;

using Microsoft.Win32;</pre>

Daha sonra yapmamız gereken, SystemEvents sınıfının statik olaylarını delegate methodlar sayesinde yakalamak.

Örneğin, ekran ayarlarının değiştirilmesi anında uygulamamızın belirli bir işi gerçekleştirmesini istiyorsak;

SystemEvents.DisplaySettingsChanging += delegate(object sender, EventArgs e) {
    Console.WriteLine("Windows Görüntü Çözünürlüğü değiştiriliyor");
};

Başka yakalayabileceğimiz olaylar;

**DisplaySettingsChanging : **Ekran özellikleri değiştirilirken **DisplaySettingsChanged : **Ekran özellikleri değiştirildikten sonra **InstalledFontsChanged : **İşletim Sisteminde kurulu fontlarda değişiklik olduğunda **PaletteChanged : **Kullanıcı farklı bir palet kullanan başka bir uygulamaya geçtiğinde **PowerModeChanged : **Kullanıcı oturumunu Suspend veya Resume yaptığında **SessionEnding : **Kullanıcı oturumunu veya işletim sistemini kapatırken **SessionEnded : **Kullanıcı oturumunu veya işletim sistemini kapattığında **SessionSwitch : **Kullanıcı oturumunu değiştirirken **TimeChanged : **Sistem saati değiştiğinde **UserPreferenceChanging : **Kullanıcı ayarlarını değiştirirken **UserPreferenceChanged : **Kullanıcı ayarlarını değiştirdiğinde

Örnek uygulamanın tüm kodları;

using System;
using Microsoft.Win32;

class Program
{
    static void Main(string[] args)
    {
        SystemEvents.DisplaySettingsChanging += delegate(object sender, EventArgs e) {
            Console.WriteLine("Windows Görüntü Çözünürlüğü değiştiriliyor");
        };

        SystemEvents.DisplaySettingsChanged += delegate(object sender, EventArgs e)
        {
            Console.WriteLine("Windows Görüntü Çözünürlüğü değiştirildi");
        };

        SystemEvents.InstalledFontsChanged += delegate(object sender, EventArgs e) {
            Console.WriteLine("Windows yüklü fon listesinde değişiklik var (ekleme veya silme)");
        };

        SystemEvents.SessionEnding += delegate(object sender, SessionEndingEventArgs e) {
            switch (e.Reason)
            {
                case SessionEndReasons.Logoff:
                    Console.WriteLine("Windows Kapatılıyor (LogOff)");
                    break;
                case SessionEndReasons.SystemShutdown:
                    Console.WriteLine("Windows Kapatılıyor (Shutdown)");
                    break;
            }
        };

        SystemEvents.SessionEnded += delegate(object sender, SessionEndedEventArgs e) {
            switch (e.Reason)
            {
                case SessionEndReasons.Logoff:
                    Console.WriteLine("Windows Kapatıldı (LogOff)");
                    break;
                case SessionEndReasons.SystemShutdown:
                    Console.WriteLine("Windows Kapatıldı (Shutdown)");
                    break;
            }
        };

        SystemEvents.SessionSwitch += delegate(object sender, SessionSwitchEventArgs e) {
            switch (e.Reason)
            {
                case SessionSwitchReason.SessionLock:
                    Console.WriteLine("Windows Kilitlendi (Windows Locked)");
                    break;
                case SessionSwitchReason.SessionUnlock:
                    Console.WriteLine("Windows Açıldı (Windows Unlocked)");
                    break;
            }
        };

        SystemEvents.UserPreferenceChanging += delegate(object sender, UserPreferenceChangingEventArgs e) {
            Console.WriteLine(e.Category.ToString() + " Ayarları Güncelleniyor");
        };

        SystemEvents.UserPreferenceChanged += delegate(object sender, UserPreferenceChangedEventArgs e) {
            Console.WriteLine(e.Category.ToString() + " Ayarları Güncellendi");
        };

        Console.ReadLine();
    }
}


Bu kodda ne yanlış var? – 5

Bu sefer bir web uygulaması projesinde görevliyiz. Uygulamanın yönetim panelini YonetimPaneli dizini içerisinde geliştirdik.

Güvenlik açısından önlem almak için web.config dosyasına şu satırları ekledik; <system .web> </system>

Fakat, Proje Lideri bu kodu gördükten sonra yüzü asıldı.

Sizce problem nedir ve nasıl düzeltebiliriz?

C# Event fırlatmak için yeni bir yöntem

C# ile geliştirdiğimiz sınıflardan event yayınlamaya genellikle ihtiyaç duyarız.

Bir sınıftan event yayınlamak için, artık ezberlediğimiz üzere, aşağıdaki yöntemi kullanırız;

public class EventTest { public event EventHandler MyEvent;

public void RaiseEvent()
{
    if(MyEvent != null)
    {
        MyEvent(this, EventArgs.Empty);
    }
} }</pre>

Devlicious‘da gördüğüm makalede, Rob Eisenberg yeni bir yöntem öneriyor.

Makaleye göre, yukarıdaki event yayınlama kodunu aşağıdaki gibi de yazabiliriz;

public class EventTest
{
    public event EventHandler MyEvent = delegate {};

    public void RaiseEvent()
    {
        MyEvent(this, EventArgs.Empty);
    }
}


*Sizce hangisini tercih etmeliyiz?*

C# Veri Tipleri

Uygulamalarımızın olmazsa olmaz unsurları herhalde değişkenlerdir. Orta ölçekli bir uygulamada, kabaca bir tahminle yüzlerce değişken tanımlıyoruzdur.

Kullanım yoğunluğuna bakarak, oluşturduğumuz değişkenlerin tiplerinin doğru belirlenmesinin ne kadar önemli olduğunu anlayabiliriz.

C# ile kullanabileceğimiz değişkenlerin en önemlilerini aşağıda listeledim;

**Veri Tipi****Kapladığı Alan****Değer Aralığı**
**Tam Sayı Veri Tipleri**
[sbyte](http://msdn.microsoft.com/library/system.sbyte)1 byte-128 ve +127
[byte](http://msdn.microsoft.com/library/system.byte)1 byte0 ve +255
[short](http://msdn.microsoft.com/library/ybs77ex4.aspx)2 byte-32768 ve +32767
[ushort](http://msdn.microsoft.com/library/cbf1574z.aspx)2 byte0 ve 65535
[int](http://msdn.microsoft.com/library/5kzh1b5w.aspx)4 byte-2.147.483.648 ve +2.147.483.647
[uint](http://msdn.microsoft.com/library/x0sksh43.aspx)4 byte0 ve 4.294.967.295
[long](http://msdn.microsoft.com/library/ctetwysk.aspx)8 byte-9.223.372.036.854.775.808 ve +9.223.372.036.854.775.807
[ulong](http://msdn.microsoft.com/library/t98873t4.aspx)8 byte0 ve 18,446,744,073,709,551,615
**Noktalı Sayı Veri Tipleri**
[single](http://msdn.microsoft.com/library/system.single)4 byte-3.402823E38 ve +3.402823E38
[double](http://msdn.microsoft.com/library/system.double)8 byte-1.79769313486232E308 ve +1.79769313486232E308
[decimal](http://msdn.microsoft.com/library/system.decimal)16 byte-7.9E1028 ve +7.9E1028
**Diğer Veri Tipleri**
[char](http://msdn.microsoft.com/library/x9h8tsay.aspx)2 byteTek Karakter
[string](http://msdn.microsoft.com/library/system.string)~ (2 byte x harf adedi)Karakter Dizisi
[bool](http://msdn.microsoft.com/library/c8f5xwh7.aspx)4 byteTrue veya False
[DateTime](http://msdn.microsoft.com/library/system.datetime)8 byte1/1/0001 12:00:00 ve 31/12/9999 23:59:59

C# siz olsanız hangisini yazardınız?

İnternette gezerken şöyle bir kod parçasına rastladım;

public void ShowPanelWindow(bool isVisible) { Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed; }

public void ShowBusy(bool isBusy) { BusyIndicator.ShowIsBusy = isBusy; }</pre>

Bu kodu yazan kişi, eğer yukarıdaki kodu şimdi yazsaydım şöyle yazardım demiş ve aşağıdaki kod parçasını yazmış;

public void HidePanelWindow()
{
    Visibility = Visibility.Collapsed;
}

public void ShowPanelWindow()
{
    Visibility = Visibility.Visible;
}

public void LookBusy()
{
    BusyIndicator.ShowIsBusy = true;
}

public void StopLookingBusy()
{
    BusyIndicator.ShowIsBusy = false;
}


Bu iki kodu okuduktan sonra, kendi kendime sordum ve ben de **ikinci tarz yaklaşımı** kullanırdım.

Peki siz olsanız hangi tarz kodu tercih ederdiniz?

Kısa kod mu? Kendini anlatan kod mu?

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı