2011-09-01 15 views
15

वीसी ++ में, मैं विंडोज़ की सूची प्राप्त करने के लिए EnumWindows (...), GetWindow (...), और GetWindowLong() का उपयोग करता हूं और जांचता हूं कि विंडो शीर्ष विंडो (मालिक के रूप में कोई अन्य विंडो नहीं है), और क्या खिड़की दिखाई दे रही है (WS_VISIBLE)। हालांकि, हालांकि मेरा डेस्कटॉप केवल 5 खिड़कियां दिखा रहा है, यह EnumWindows मुझे 50 विंडोज़ दे रहा है, कितना हास्यास्पद है! यहां कोई भी विंडोज गीक कृपया मुझे स्पष्टीकरण में मदद करें ...EnumWindows मुझे अपेक्षा से अधिक विंडोज़ क्यों लौटाता है?

+1

मैं भी एक खिड़की ग देखा सहयोगी "स्टार्ट बटन" – jondinham

+7

ऐसा इसलिए है क्योंकि स्टार्ट बटन एक विंडो है। –

उत्तर

27

(Alt-टैब बॉक्स में या इसी तरह) टास्कबार में केवल खिड़कियों की सूची के लिए रास्ता MSDN ब्लॉग पर इस लेख में रेमंड द्वारा वर्णित है:
http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx

और यह है कि क्या एक जांच करने के लिए सुपर समारोह है खिड़की ऑल्ट-टैब में दिखाया गया है:

BOOL IsAltTabWindow(HWND hwnd) 
{ 
    TITLEBARINFO ti; 
    HWND hwndTry, hwndWalk = NULL; 

    if(!IsWindowVisible(hwnd)) 
     return FALSE; 

    hwndTry = GetAncestor(hwnd, GA_ROOTOWNER); 
    while(hwndTry != hwndWalk) 
    { 
     hwndWalk = hwndTry; 
     hwndTry = GetLastActivePopup(hwndWalk); 
     if(IsWindowVisible(hwndTry)) 
      break; 
    } 
    if(hwndWalk != hwnd) 
     return FALSE; 

    // the following removes some task tray programs and "Program Manager" 
    ti.cbSize = sizeof(ti); 
    GetTitleBarInfo(hwnd, &ti); 
    if(ti.rgstate[0] & STATE_SYSTEM_INVISIBLE) 
     return FALSE; 

    // Tool windows should not be displayed either, these do not appear in the 
    // task bar. 
    if(GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) 
     return FALSE; 

    return TRUE; 
} 

यहां स्रोत कोड के लिए श्रेय:
http://www.dfcd.net/projects/switcher/switcher.c

+1

कोई भी जानता है कि यह फ़ंक्शन 'डब्लूएस_EX_TOOLWINDOW' और' WS_EX_APPWINDOW' रेमंड द्वारा उनके ब्लॉग पोस्ट में उल्लिखित विस्तारित शैली के मामलों पर क्यों विचार नहीं करता है? क्या 'STATE_SYSTEM_INVISIBLE' इसे कवर करता है या यह कार्य एक रेमंड का वर्णन करता है के साथ सटीक मिलान नहीं है? –

+0

@adamsmith toolwindow शीर्ष विंडो नहीं है, यह टास्कबार या alt-tab मेनू में नहीं दिखाया जाएगा। क्योंकि टूलविंडो की मूल विंडो शून्य नहीं है – jondinham

+5

सूची में टूल विंडो को निकालने के लिए एक अतिरिक्त सुधार है, जिसे भी नहीं दिखाया जाना चाहिए। जैसा कि @ डेविड हेफरनन ने दूसरे उत्तर में उल्लेख किया है, यह दस्तावेज [निम्नलिखित एमएसडीएन लेख में] है [http: //http//msdn.microsoft.com/en-us/library/aa969325.aspx)।मैंने चेक के साथ उपरोक्त कोड में सुधार किया है: 'अगर (GetWindowLong (hwnd, GWL_EXSTYLE) और WS_EX_TOOLWINDOW) वापसी गलत;' –

3

जिन विंडोों के बारे में आप बात कर रहे हैं, एक्स बटन और टाइटल बार आदि के साथ एकमात्र प्रकार की खिड़कियां नहीं हैं। बटन, ड्रॉपडाउन मेनू, लेबल, आइकन, टेक्स्ट बॉक्स, टास्क बार, और बस बाकी सब कुछ एक विंडो भी है । तो EnumWindows वही कर रहा है जो इसे करना है: सभी शीर्ष स्तर की विंडो का आकलन करें।

हालांकि यह सच है, EnumWindows केवल शीर्ष स्तर की विंडो को दर्शाता है। इसका मतलब है कि it won't enumerate any child windows:

EnumWindows समारोह बच्चे खिड़कियों की गणना नहीं करता है, कुछ उच्च-स्तरीय प्रणाली है कि WS_CHILD शैली है के स्वामित्व में खिड़कियों के अपवाद के साथ।

हालांकि, आपके डेस्कटॉप पर कई चीजें विंडोज़ भी हैं, न केवल "खिड़कियां" जिनके बारे में आप सोच रहे हैं।

+0

तो असंबंधित "तथाकथित" खिड़कियों से छुटकारा पाने के लिए कोई विचार? मैं सिर्फ दृश्य विंडो की एक सूची चाहता हूं (एप्लिकेशन विंडोज़, संवाद नहीं, बटन नहीं, आदि) – jondinham

+2

शायद आप केवल [विंडो जो टास्कबार में दिखाई देते हैं] (http: // http: //msdn.microsoft.com/en -US/पुस्तकालय/aa969325.aspx)। "शैल टास्कबार पर एक बटन बनाता है जब भी कोई एप्लिकेशन एक विंडो बनाता है जिसका स्वामित्व नहीं है। यह सुनिश्चित करने के लिए कि टास्कबार पर विंडो बटन रखा गया है, WS_EX_APPWINDOW विस्तारित शैली के साथ एक अनूठी विंडो बनाएं। विंडो बटन को होने से रोकने के लिए टास्कबार पर रखा गया है, WS_EX_TOOLWINDOW विस्तारित शैली के साथ अनूठी विंडो बनाएं। वैकल्पिक के रूप में, आप एक छिपी हुई विंडो बना सकते हैं और इस छिपी हुई विंडो को अपनी दृश्य विंडो के मालिक बना सकते हैं। " –

+0

हाँ, मैं टास्कबार में दिखाई देने वाली विंडो की सूची चाहता हूं। मुझे पता है कि कैसे छिपाना है, अलग-अलग मोड में एक विंडो दिखाएं; लेकिन मुझे नहीं पता कि यह सूची कैसे प्राप्त करें – jondinham

संबंधित मुद्दे