2013-01-22 2 views
1

내가 수행하는 간단한 도구을해야 다음 버튼 경우 창 제목이 미리 정의 된 문자열을 WinForms 응용 프로그램을 시작하고 C# 코드를 사용하여 단추가 있는지 확인하는 방법은 무엇입니까?

  • 검사에 일치하는 경우

    • 는 로컬 디스크에있는 파일을
    • 검사를 윈폼 응용 프로그램을 시작합니다

      Process myApp = new Process(); 
      myApp.StartInfo.FileName = "somePath"; 
      app.Start(somePath); 
      
      ,691 :

    내가 응용 프로그램을 시작하려면이 코드를 사용하는 응용 프로그램 창에 존재

    myApp.MainWindowTitle 속성을 사용하여 창 이름을 확인합니다.

    버튼이 있는지 확인하는 것과 같이 애플리케이션 윈도우에 무엇이 있는지 확인하는 방법을 알고 싶습니다.

    이 도구의 목적은 응용 프로그램이 올바르게 시작되는지 확인하는 것입니다. 지금 Visual Studio CodedUI 기능이 무엇인지, 어떻게 도움이되는지 알아 보려고합니다. 그러나 지금까지 결과가 없습니다.

    누군가가 내게 정보와 아이디어를 줄 수 있다면 매우 감사 할 것입니다.

  • +0

    앱이 제대로 시작되지 않는 경우 몇 가지 예외가 발생합니다. 그렇다면 어쩌면 예외를 기록한 다음 로그를 검사하는 것이 더 좋을 수도 있습니다. –

    +0

    프로세스 창이있는 경우 버튼이 있는지 여부를 감지 할 수는 없습니다. –

    +0

    http://msdn.microsoft.com/en-us/magazine/cc163617.aspx –

    답변

    0

    다른 질문에 대한 답변 이었지만 John Bartel's post here이 도움이 될 수 있습니다. 그의 솔루션의 두 번째 섹션 인 "더 어려운 솔루션"을 살펴보십시오. 희망이 도움이됩니다.

    0

    나는 오래 전에서 오래된 먼지가 델파이 코드를 파고 있고, 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()); 
    }