2014-03-07 2 views
0

나는 동일한 유형의 소수의 프로그램을 동시에 제어하기 위해 프로그램 작업을하고 있습니다.부모에게 주어진 열린 창 핸들을 얻는 가장 효율적인 방법은 무엇입니까?

지금까지 EnumWindows()를 사용하여 제어 할 적절한 창 (프로그램)의 핸들을 수집했습니다. 일부 키보드 입력을 인식하면 모든 프로그램을 반복하고 (열 수있는 숫자가있을 수 있음) EnumChildWindows()를 사용하여 모든 프로그램에 클릭 메시지를 동시에 게시하여 해당 창 (버튼)을 찾습니다. 키 입력을 누른 다음 PostMessage()를 사용하여 실제로 클릭을 보냅니다.

내가 제어하는 ​​이러한 각 프로그램에는 클릭 할 때 파일 열기 대화 상자를 여는 "로드 설정"이라는 버튼이 있습니다. 내가하고 싶은 것은 PostMessage()를 사용하여 "Load Settings"을 클릭하는 것입니다 (나는 지금까지 성공적으로이 것을 얻었고, 다음은 내가하려고하는 일이다). 그런 다음 해당 파일 열기 대화 상자 창의 핸들을 가져오고 텍스트 필드에 이미 결정한 해당 설정 파일의 경로를 채운 다음 "열기"단추를 클릭하여 작업을 완료하고 열기 창을 닫습니다 .

내 주요 문제는 열린 창을 찾는 것입니다. 이제 EnumWindows를 다시 사용하여 해당 창을 찾을 수 있지만이 문제는 "설정로드"를 클릭 할 때 열기 창이 즉시 열리지 않습니다. 나는 버튼을 클릭 한 후 잠을 잘 수 있고 그것을 발견하기 위해 창을 열거하지만 창은 여는 데 시간이 걸릴 수 있으므로 실용적이지 않다.

저는이 창에 대한 정보를 수집하기 위해 spy ++를 사용했지만, 제가 아는 한 그 중 아무 것도 도움이되지 않습니다. 어쨌든, 여기 내가 찾은 것이 있습니다 :

  • "Open"창은 열어 본 프로그램의 이전 창입니다.
  • "열기"의 부모는 열어 본 프로그램입니다.
  • "Open"의 소유자는 열어 본 프로그램입니다.

가 자사의 윈도우 속성에서 메인 프로그램의 자식으로 나열 비록, 그것은 메인 프로그램과 동일한 수준에 열거 된 (그것은 다른 자식 창처럼 중첩 아니에요).

FindWindowEx() 및 EnumChildWindows()를 시도했지만 Open window를 찾을 수 없습니다.

일부 핸들을 기반으로 이전 창 핸들을 얻는 방법이 있어야한다고 생각합니다.

일단 제대로 작동하면 편집 (텍스트 입력란) 창에 적절한 파일 경로를 입력해야합니다.

+0

에서 더 많은 정보를 참조하십시오, 당신은 [System.Windows.Automation] (http://msdn.microsoft.com/en-us/library/system.windows 사용하여 더 나을 수 있습니다. 자동화 (v = vs.110) .aspx). 그것은 이런 종류의 것을 의미하며 .NET 라이브러리이므로 P/Invoke를 피할 수 있습니다. 다음은 [부부] (http : //blogs.msdn.(예 : com/b/oldnewthing/archive/2014/02/24/10502479.aspx) (http://blogs.msdn.com/b/oldnewthing/archive/2014/03/03/10504441.aspx)를 참조하십시오. –

+0

자동화에 대해 전혀 들어 본 적이 없거나 들어 본 적이 없기 때문에 확실히 살펴 보겠습니다. 감사 –

답변

0

목표가 UI 작업 (예 : 테스트 용)을 자동화하는 것이면 UIA가 원하는 것입니다. UIA는 시스템에서 활성화 된 모든 응용 프로그램을 포함하는 전체 UIA 트리를 노출합니다.

그래서 각 응용 프로그램마다 하나의 하위 노드가있는 루트 노드가 표시됩니다. 각 노드는 해당 응용 프로그램의 최상위 창을 나타내야합니다. 더 이상의 자식들은 응용 프로그램 자체에 의존합니다.

이 여담으로 UIA Overview

관련 문제