나는 오래 전에서 오래된 먼지가 델파이 코드를 파고 있고, C#을 번역 : 모든 자식 창을 열거합니다
등급 :
public static class WindowsEnumerator
{
private static List<IntPtr> childs = new List<IntPtr>();
public static List<WindowInfo> EnumerateChildWindows(IntPtr parentHandle)
{
var result = new List<WindowInfo>();
childs.Clear();
EnumChildWindows(parentHandle, Enumerator, IntPtr.Zero);
foreach (IntPtr handle in childs)
{
result.Add(new WindowInfo(handle));
}
return result;
}
private static bool Enumerator(IntPtr hwnd, IntPtr lparam)
{
childs.Add(hwnd);
return true;
}
internal delegate bool WindowEnumProc(IntPtr hwnd, IntPtr lparam);
[DllImport("user32.dll")]
internal static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc func, IntPtr lParam);
}
public class WindowInfo
{
public IntPtr Handle { get; private set; }
public string Text { get; private set; }
public string ClassName { get; private set; }
public WindowInfo(IntPtr hwnd)
{
this.Handle = hwnd;
var sb = new StringBuilder(1024);
var txtLen = GetWindowText(this.Handle, sb, sb.Capacity);
if (txtLen > 0)
this.Text = sb.ToString();
else
this.Text = "";
var sbc = new StringBuilder(256);
var clsLen = GetClassName(this.Handle, sbc, sbc.Capacity);
if (clsLen > 0)
this.ClassName = sbc.ToString();
else
this.ClassName = "";
}
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
}
을 그리고 당신은 단지와 버튼을 찾을 수있다 정적 메소드 WindowsEnumerator.EnumerateChildWindows, 윈폼 버튼은 클래스 이름에 "BUTTON"문자열을 가지고 있으며,의이 버튼을 Button1을 이름 (그리고 같은 이름을 사용하지 않는 희망)되는 것을 가정하자 :
private void button1_Click(object sender, EventArgs e)
{
var exeProcess = Process.Start(@"w:\kanta\temp\ExeWithButtonInsideGroupBox.exe");
while (exeProcess.MainWindowHandle.ToInt32() == 0)
{
Thread.Sleep(10);
};
var windows = WindowsEnumerator.EnumerateChildWindows(exeProcess.MainWindowHandle);
exeProcess.Kill();
bool myButtonExists = windows.FirstOrDefault(wnd => wnd.ClassName.Contains("BUTTON") && wnd.Text == "button1") != null;
MessageBox.Show(myButtonExists.ToString());
}
앱이 제대로 시작되지 않는 경우 몇 가지 예외가 발생합니다. 그렇다면 어쩌면 예외를 기록한 다음 로그를 검사하는 것이 더 좋을 수도 있습니다. –
프로세스 창이있는 경우 버튼이 있는지 여부를 감지 할 수는 없습니다. –
http://msdn.microsoft.com/en-us/magazine/cc163617.aspx –