private static void EnumChildWindows(RunningWindowTableItemCollection list, IntPtr mainHandle, IntPtr handle, int maximumResultCount) { ChildWindowEnumerator childEnumerator = new ChildWindowEnumerator(handle); IntPtr[] childWindows = childEnumerator.EnumerateWindows(4000); if (null != childWindows) { foreach (IntPtr item in childWindows) { DoAccTest(list, mainHandle, item, maximumResultCount); } } }
/// <summary> /// Enumerates all child windows. WARNING: The method returns null if operation timeout is reached. /// </summary> /// <param name="milliSecondsTimeout">a timeout for the operation. when a window is busy or non responding these method freeze. you can handle this with the operation timeout</param> /// <returns>result array or null</returns> public IntPtr[] EnumerateWindows(int milliSecondsTimeout) { if (milliSecondsTimeout < 0) { throw new ArgumentOutOfRangeException("milliSecondsTimeout"); } try { lock (_lockInstance) { Result.Clear(); _currentInstance = this; Thread thread1 = new Thread(new ParameterizedThreadStart(EnumerateWindowsAsync)); WaitHandle[] waitHandles = new WaitHandle[1]; ManualResetEvent mre1 = new ManualResetEvent(false); waitHandles[0] = mre1; thread1.Start(mre1); bool result = WaitHandle.WaitAll(waitHandles, milliSecondsTimeout); if (!result) { thread1.Abort(); Result.Clear(); _currentInstance = null; return(null); } else { _currentInstance = null; } } return(Result.ToArray()); } catch (Exception exception) { DebugConsole.Default.WriteException(exception); throw; } }