Otomatik Kapanan MessageBox

Otomatik Kapanan MessageBox

Projelerde “MessageBox” kullanmak hayat kurtarır, yeri gelir kullanıcıya soru sorarız, yeri gelir sadece bilgi veririz. Birde otomatik yapılan işlemlerde “MessageBox” çıkartırsak program maalesef “MessageBox” ın kapatılmasını bekler devam etmek için. Peki bir “MessageBox” ı nasıl otomatik kapatabiliriz?

Aslında bunun cevabı aşağıda paylaşacağım kod bloğu ile çok kolay.

Öncelikle projemize bir adet “Class” ekliyoruz ve adına “AutoClosingMessageBox” veriyoruz. Daha sonra aşağıda sizinle paylaştığım kodları içerisine yazıyoruz.

public class AutoClosingMessageBox {
    System.Threading.Timer _timeoutTimer;
    string _caption;
    DialogResult _result;
    DialogResult _timerResult;
    AutoClosingMessageBox(string text, string caption, int timeout, MessageBoxButtons buttons = MessageBoxButtons.OK, DialogResult timerResult = DialogResult.None) {
        _caption = caption;
        _timeoutTimer = new System.Threading.Timer(OnTimerElapsed,
            null, timeout, System.Threading.Timeout.Infinite);
        _timerResult = timerResult;
        using(_timeoutTimer)
            _result = MessageBox.Show(text, caption, buttons);
    }
    public static DialogResult Show(string text, string caption, int timeout, MessageBoxButtons buttons = MessageBoxButtons.OK, DialogResult timerResult = DialogResult.None) {
        return new AutoClosingMessageBox(text, caption, timeout, buttons, timerResult)._result;
    }
    void OnTimerElapsed(object state) {
        IntPtr mbWnd = FindWindow("#32770", _caption); // lpClassName is #32770 for MessageBox
        if(mbWnd != IntPtr.Zero)
            SendMessage(mbWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
        _timeoutTimer.Dispose();
        _result = _timerResult;
    }
    const int WM_CLOSE = 0x0010;
    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
}

Buraya kadar iyi güzel geldik. Peki bu yazdığımız kodu nasıl çağıracağız?

var userResult = AutoClosingMessageBox.Show("Bu İşlemi Yapmak İstediğinize Emin misiniz?", "MessageBox Başlığı", 10000, MessageBoxButtons.YesNo);
if(userResult == System.Windows.Forms.DialogResult.Yes) { 
    // Yapmak istediğiniz işlem
  
}

Burada ki işi kısaca özetleyecek olursak, kullanıcıya yapmaya çalıştığı işlemi gerçekten onaylayıp, onaylamadığını soruyoruz ve bir cevap vermesi için ona 10 saniye tanıyoruz. Eğer 10 saniye içerisinde kullanıcıya sunduğumuz cevaplardan birini vermezse if else bloğunda ona göre işlemlerimizi sonlandırıyoruz.

Umarım işinize yarayan bir bilgi olmuştur.

Paylaş :

Bu gönderiyi paylaş

Comments (2)

  • Taha cevap

    Kullanıcı kopyala butonuna bastığında ekranda Kopyalandı yazıyor. Benim isteğimde MessageBox 3 saniye sonra kapansın. Ama kendiğiliğiden. Bunu nasıl yapabilirim.

    Kasım 26, 2023 , 10:01 pm
    • Fatih BAŞ cevap

      Hocam üstte kullanım şeklini sundum. Projeye class olarak eklersen verdiğim class’ı kopyalandı kısmı için ikinci kod bloğundaki kısımda MessageBoxButtons.YesNo kısmını MessageBoxButtons.OK diye değiştirirsen çalışacaktır.

      Kasım 26, 2023 , 10:16 pm

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.