2010-03-12 2 views
0

랭 : C# .NET을 2.0질문 처리

1, 2 또는 3 일 때 나는 하위 창 1, 2, 3

나는 메시지 박스가 팝업됩니다를 호출하는 응용 프로그램 X를 가지고 열렸다.

제 아이디어는 매 3 초마다 틱하고 창이 열리는 지 확인하는 타이머입니다.

하지만 3 개의 정확한 창을 찾는 방법은 무엇입니까? Window Handle-Spy-Application을 사용하고 내 코드의 Window-Handles를 하드 코드 할 수 있습니까? 또는 응용 프로그램 X가 새로 열릴 때 창 핸들을 변경 하시겠습니까?

답변

1

.NET Framework보다 Win32에 익숙하고 .NET Framework에서 적절한 함수를 찾거나 P/Invoke를 사용하여 Win32 함수를 호출 할 수 있으므로 Win32의 관점에서 대답 할 것입니다.

난 당신이 다음 알고 있으리라 믿고있어 : 응용 프로그램 X의

  • 프로세스 ID를
  • 이름 (또는 텍스트) 또는 Windows 1, 2, 3,이 창을 고유하게 식별 할 텍스트를 가지고 .

프로세스 ID를 모르는 경우 프로세스를 열거하고 각 프로세스의 이름을 Application X와 비교해야합니다. 일치하는 항목이 있으면 프로세스 ID를 알고 있어야합니다.

먼저 세 개의 창을 찾으려면 프로세스 ID가있는 최상위 창을 찾으십시오. 이들 중 하나는 서브 윈도우의 조상이 될 것입니다.

EnumWindows()를 사용하여 모든 창을 열거하십시오. 열거하는 동안 당신이 찾고있는 프로세스 ID를 가진 모든 윈도우 (하나 이상있을 수 있음)를 적어 두십시오.

프로세스 ID와 일치하는 창의 목록을 사용하여 해당 목록의 각 창의 하위를 모두 확인해야합니다. EnumChildWindows()를 사용하여이 작업을 수행 할 수 있습니다. 더 이상 없을 때까지 자녀 창문의 모든 하위 창을 확인하십시오. 그렇게하면 프로세스의 모든 창을 커버 할 수 있습니다. 찾은 각 창에 대해 찾고있는 하위 창의 알려진 텍스트와 비교하십시오. 어딘가에 당신이 그것을 사용할 수있는 HWND 매치 스토어를 얻을 때.

이제 HWND가 있으므로 .Net 사용 가능한 Windows 컨트롤로 변환 할 수 있다고 가정합니다.

EnumWindows는 .Net Framework의 일부가 아니므로이 작업을 수행하려면 P/Invoke를 사용해야합니다. 모든 검색을 수행하고 배열의 HWND를 다시 전달하는 C/C++의 도우미 함수를 작성하는 것이 더 쉽습니다. 이렇게하면 P/Invoke를 통해 하나의 함수 만 호출하면됩니다. C/C++에서 Win32를 직접 호출하는 것이 더 직관적 일 수 있습니다.