Merhaba, bugün size Windows Forms uygulamalarında üstteki menüye sağ tıklayınca gelen menüye bir buton ekleyip ona bağlı bir eventi (olayı) tetiklemeyi anlatacağım.

İlgili menüyü eklemek için DllImport yönetimi ile “user32.dll” dll’sini içeri (import) almamız gerekecektir. Normalde bir forma sağ tıkladığımızda gelen görüntü aşağıdaki gibidir:

Windows Forms Sağ Tıklama Varsayılan Menü
Windows Forms Sağ Tıklama Varsayılan Menü

Biz ilgili kodda ilgili ilaveleri yapınca aşağıdaki benzeyen bir görüntü ortaya çıkacaktır.

Özelleştirilen Sağ Tıklama Menüsü
Özelleştirilen Sağ Tıklama Menüsü

Aşağıdaki kodu formun sınıf (class) tanımının altına koymamız yeterli olacaktır:

        // Windowsun kullandığı Sistem Komutu
        public const Int32 WM_SYSCOMMAND = 0x112;
        public const Int32 MF_BYPOSITION = 0x400;
        // Separatör koymak için
        private const int SEPARATOR = 0x800;
        public const Int32 MENUYARDIMID = 1000;
        public const Int32 MENUHAKKINDAID = 1001;

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool InsertMenu(IntPtr hMenu, int uPosition, int uFlags, int uIDNewItem, string lpNewItem);

        protected override void WndProc(ref Message m)
        {

            // Eğer gelen mesaj Sistem mesajıysa
            if ((m.Msg == WM_SYSCOMMAND))
            {
                // Eğer Gelen Paramtere değeri YARDIMID ise
                if (((int)m.WParam == MENUYARDIMID))
                {
                    MessageBox.Show("Yardım");
                }
                // Eğer Gelen Paramtere değeri HAKKINDAID ise
                if (((int)m.WParam == MENUHAKKINDAID))
                {
                    MessageBox.Show("ysancar.com", "ysancar.com");
                }
            }

            base.WndProc(ref m);
        }
        // Form Load Eventi
        private void Form2_Load(object sender, EventArgs e)
        {
            IntPtr MenuHandle = GetSystemMenu(this.Handle, false);
            InsertMenu(MenuHandle, 5, SEPARATOR | MF_BYPOSITION, 0, String.Empty);
            InsertMenu(MenuHandle, 6, MF_BYPOSITION, MENUYARDIMID, "Yardım");
            InsertMenu(MenuHandle, 7, MF_BYPOSITION, MENUHAKKINDAID, "Hakkında");

        }

İlk önce eklemek istediğimiz menülere bir ID ataması yapıyoruz. Ben 1000 ve 1001 kullandım. Sonrasında form yüklendikten sonra GetSystemMenu ile formun bellekteki adresini MenuHandle değişkenine kopyalıyoruz ve 6. sıraya (5. indis) bir separatör yani ayraç ekliyoruz. Daha sonra 7. ve 8. sıralara da yukarıda tanımladığımız ID lerle sırasıyla “Yardım” ve “Hakkında” yazdırıyoruz. Böylece artık menüye sağ tıkladığımızda artık ilgili alanlar gözükecektir. Uygulamanın işleyişinde yeni yaratılan menülere tıklandığını algılamak için ise Form objesinin WndProc olayını (event) aşırı yüklüyoruz (override). Bu olay formda olan biten her şeyin raporlandığını bir fonksiyonmuş gibi düşünebilirsiniz.

Eğer gelen mesaj bir sistem komutu ise (0x112) bizim oluşturduğumuz yeni menülere düşme olasılığı var demektir. Daha sonrasında ise gelen mesajın parametresi yeni tanımladığımız menülerin IDlerinden birine eşit ise bir mesaj döndürüyoruz. Burada dikkat etmeniz gereken şey fonksiyonun altında yazan

base.WndProc(ref m);

ifadesidir. Bu ifade bizim fonksiyonla işimizi bitti normal çalıştığın şekilde çalışmaya devam et demek içindir. Eğer bu kodu koymayı unutursanız veya bir sebepten dolayı çalıştırmazsanız uygulamanızda istenmeyen durumlara yol açabilirsiniz.

Bir yanıt yazın

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