2011-08-10 12 views
10

जब मैं विंडोज एपीआई विधि EnumChildWindows का उपयोग करने की बात आती हूं तो मुझे अजीब व्यवहार मिल रहा है। ऐसा लगता है कि बच्चों की खिड़कियों का एक वर्ग नहीं उठा रहा है। जब मैं जासूस ++ का उपयोग करके ड्रिल करता हूं तो मैं बच्चों को देख सकता हूं, लेकिन जब मैं अपना कोड निष्पादित करता हूं, तो यह उन लोगों को वापस नहीं करता है जिन्हें मैं Spy ++ में देखता हूं।EnumChildWindows बच्चों को क्यों छोड़ रहा है?

public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter); 

    [DllImport("user32")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i); 

    public static List<IntPtr> GetChildWindows(IntPtr parent) 
    { 
     List<IntPtr> result = new List<IntPtr>(); 
     GCHandle listHandle = GCHandle.Alloc(result); 
     try 
     { 
      EnumWindowProc childProc = new EnumWindowProc(EnumWindow); 
      EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle)); 
     } 
     finally 
     { 
      if (listHandle.IsAllocated) 
       listHandle.Free(); 
     } 
     return result; 
    } 

    private static bool EnumWindow(IntPtr handle, IntPtr pointer) 
    { 
     GCHandle gch = GCHandle.FromIntPtr(pointer); 
     List<IntPtr> list = gch.Target as List<IntPtr>; 
     if (list == null) 
      throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>"); 

     list.Add(handle);    
     return true; 
    } 

वहाँ क्यों ऊपर स्क्रीनशॉट में हाइलाइट किए लाल अनुभाग मेरे संग्रह में डाला जा नहीं होगा के रूप में एक कारण (है:

आई स्पाई में ++ What I see in Spy++ http://img24.imageshack.us/img24/9264/spyhandles.png

यहाँ क्या देख मेरी कोड है List<IntPtr>) EnumChildWindows को कॉल करते समय?

+0

मैंने इस कोड को मेरे FindWindowsByClassAndTitle() फ़ंक्शन में कार्यान्वित किया और यह पहले से उपयोग किए जा रहे कोड से लगभग 30 मिलियन गुना तेज पाता है। – Anders

उत्तर

8

दोह! मैंने अपने तरीकों की त्रुटियों की खोज की। कारण मैं केवल बच्चों का आधा हिस्सा प्राप्त कर रहा था, इस तथ्य के कारण मैं खिड़की के लिए शुरू में लंबे समय तक इंतजार नहीं कर रहा था और इसके अंदर के सभी बच्चों को बनाने के लिए, इसलिए मुझे केवल पहली छमाही मिली थी जो इसे बनाया गया था समय मैं अपने बच्चे को सभी बच्चों की खिड़कियां प्राप्त करने के लिए बुला रहा था। इसलिए मैंने EnumChildWindows() को कॉल करने से पहले सोने की एक पंक्ति जोड़ा।

"विंडोज EnumChildWindows कहलाए जाने के बाद बनाए गए किसी भी बच्चे की खिड़कियों के लिए कॉलबैक फ़ंक्शन को कॉल नहीं करता है लेकिन इसे लौटने से पहले।" - Source

सूचना के उपरोक्त उद्धृत टुकड़े ने मेरे सिर पर प्रकाश-बल्ब को बदल दिया है।

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