2010-06-16 14 views
8

Tuhaf başlık hakkında üzgünüm, şu anda WinForms ile uğraşıyorum ve bunu yapmak için herhangi bir yol olup olmadığını merak ediyorum Pencere odaklanmamışken menstrip içindeki bir öğeyi etkinleştirmek için pencereyi 'çift tıklatmalı' mıdır?Menülere tıkladığınızda odaklanmamış bir pencereyi çift tıklatmak için 'gereksinim' özelliğini devre dışı bırakın

Şu anda pencere odaklanmamışsa, önce odaklanmak için pencereyi tıklatmalı ve sonra faremin başından itibaren menstrip öğesinin üzerine gelse bile menüler öğesi üzerine bir kez daha tıklamak zorundayım.

Şimdiden teşekkürler! senin Formu sınıfında bu işlevi koyarak

cevap

8

Dene: içinde

protected override void WndProc(ref Message m) { 
    int WM_PARENTNOTIFY = 0x0210; 
    if (!this.Focused && m.Msg == WM_PARENTNOTIFY) { 
     // Make this form auto-grab the focus when menu/controls are clicked 
     this.Activate(); 
    } 
    base.WndProc(ref m); 
} 
+0

Sadece mükemmel çalıştı, çok teşekkürler! – Gustav

0

yöntem @ pencere durulacak Detmar cevabı penceresi yok edilir (https://msdn.microsoft.com/en-us/library/windows/desktop/hh454920(v=vs.85).aspx bakınız). Uygulamanızda birden çok pencereye sahipseniz ve çıkmaktaysanız, sorunlara neden olabilir. Pencereleri imha ederken tetiklemeyeceğiniz bir nokta:

protected override void WndProc(ref Message m) 
    { 
     const int WM_PARENTNOTIFY = 0x0210; 
     if (!this.Focused && m.Msg == WM_PARENTNOTIFY) 
     { 
      const int WM_CREATE = 0x0001; 
      const int WM_DESTROY = 0x0002; 
      const int WM_LBUTTONDOWN = 0x0201; 
      const int WM_MBUTTONDOWN = 0x0207; 
      const int WM_RBUTTONDOWN = 0x0204; 
      const int WM_XBUTTONDOWN = 0x020B; 
      const int WM_POINTERDOWN = 0x0246; 

      int type = (int)(0xFFFF & (long)m.WParam); 
      switch (type) 
      { 
       case WM_LBUTTONDOWN: 
       case WM_MBUTTONDOWN: 
       case WM_RBUTTONDOWN: 
       case WM_XBUTTONDOWN: 
       case WM_POINTERDOWN: 
        // Make this form auto-grab the focus when menu/controls are clicked 
        this.Activate(); 
        break; 
       case WM_DESTROY: 
       case WM_CREATE: 
        //do nothing 
        break; 
      } 
     } 
     base.WndProc(ref m); 
    } 
İlgili konular