1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- using System.Runtime.InteropServices;
- using System.Text;
- namespace DummyCursor.Spy
- {
- internal class WndFinder
- {
- [DllImport("user32.dll", CharSet = CharSet.Unicode)]
- private static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount);
- [DllImport("user32.dll", CharSet = CharSet.Unicode)]
- private static extern int GetWindowTextLength(IntPtr hWnd);
- [DllImport("user32.dll")]
- private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);
- [DllImport("user32.dll")]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
- // Delegate to filter which windows to include
- public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
- /// <summary> Get the text for the window pointed to by hWnd </summary>
- public static string GetWindowText(IntPtr hWnd)
- {
- int size = GetWindowTextLength(hWnd);
- if (size > 0)
- {
- var builder = new StringBuilder(size + 1);
- GetWindowText(hWnd, builder, builder.Capacity);
- return builder.ToString();
- }
- return String.Empty;
- }
- /// <summary> Find all windows that match the given filter </summary>
- /// <param name="filter"> A delegate that returns true for windows
- /// that should be returned and false for windows that should
- /// not be returned </param>
- public static IEnumerable<IntPtr> FindWindows(EnumWindowsProc filter)
- {
- List<IntPtr> windows = new List<IntPtr>();
- void EnumChild(IntPtr hWnd, IntPtr lParam)
- {
- EnumChildWindows(hWnd, delegate (IntPtr hWndChild, IntPtr lParamChild)
- {
- if (filter(hWndChild, lParam))
- {
- // only add the windows that pass the filter
- windows.Add(hWndChild);
- }
- EnumChild(hWndChild, lParamChild);
- return true;
- }, IntPtr.Zero);
- }
- EnumWindows(delegate (IntPtr wnd, IntPtr param)
- {
- if (filter(wnd, param))
- {
- // only add the windows that pass the filter
- windows.Add(wnd);
- }
- EnumChild(wnd, param);
- // but return true here so that we iterate all windows
- return true;
- }, IntPtr.Zero);
- return windows;
- }
- /// <summary> Find all windows that contain the given title text </summary>
- /// <param name="titleText"> The text that the window title must contain. </param>
- public static IEnumerable<IntPtr> FindWindowsWithText(string titleText)
- {
- return FindWindows(delegate (IntPtr wnd, IntPtr param)
- {
- return GetWindowText(wnd).Contains(titleText);
- });
- }
- }
- }
|