2010-07-29 4 views
2

저는 아주 오래된 Visual Basic 6 GUI를 자동화 할 수있는 약간의 매크로 레코드/재생 도구를 만들고 있습니다. 이렇게하려면 컨트롤의 이름 (컨트롤의 name 속성 값)으로 컨트롤을 식별합니다.HWND가 지정된 Visual Basic 컨트롤의 이름은 어떻게 얻을 수 있습니까?

이 도구의 한 부분은 해당 HWND가있는 컨트롤의 이름을 결정해야합니다. VB.NET을 사용하여 수행 된 최신 Visual Basic 응용 프로그램의 경우 Windows 메시지 WM_GETCONTROLNAME을 사용할 수 있습니다. 이것은 잘 작동합니다.

그러나이 메시지는 이전 창에서 이해할 수 없습니다. Visual Basic 6 응용 프로그램의 컨트롤을 위해이 작업을 수행 할 수있는 방법이 있습니까? GUI 프로세스를 필요로하지 않는 솔루션은 preferrable 일 수 있지만, GUI 프로세스 내에서만 작동하는 솔루션을 사용하면 수용 할 수 있습니다 (직접 주입을 할 수 있기 때문에).

UPDATE : 한 가지 난 그냥 노력이 적당한 성공 : 나는 주어진 HWND를 표시 객체의 IAccessible 인터페이스의 구현을 확인하기 위해 AccessibleObjectFromWindow을 사용했다. 구현 (많은 [모든?] Visual Basic 컨트롤이이 인터페이스를 구현하는 것 같다) 인 경우 accName 속성을 사용하여 "접근 가능한 이름"을 읽습니다. 때로는 유용한 문자열을 생성하지만 대개는 유용하지 않습니다.

답변

1

유일한 방법은 프로세스 내부에 들어가서 Form 개체에 대한 포인터를 얻는 것이지만 아직은 외부에서 수행하는 방법을 모릅니다.

더 오래된 응용 프로그램에 WM_GETCONTROLNAME에 대한 지원을 추가 할 수 있습니까?

어쩌면 컨트롤을 다른 사용 가능한 속성으로 식별 할 수 있습니까?

레이몬드 (Raymond)의 말처럼, there isn't much you can do.

+0

모두 감사합니다. 감사합니다. 지금 당장은 실제로 처리 할 수 ​​있어야하고 Form 객체에 직접 액세스해야합니다. 나는 그 일을하는 방법을 모르지만 이미 몇 달 전에 비슷한 일을 해왔으므로 효과가있을 수 있습니다. –

1

vb6 앱을 수정할 수 있습니까? 그렇다면 각 폼로드 이벤트에서 me.controls를 반복하고 SetProp(ctrl.hwnd, "MYNAME:" & ctrl.name, 0) API를 사용하여 창 자체 속성 목록에 이름을 추가 한 다음 EnumProps(ctrl_HWND)MYNAME:으로 시작하는 값을 찾고 다른 값을 파싱 할 수 있습니다 .

+0

아주 창의적인 아이디어! 그러나 - 아니, 응용 프로그램을 수정할 수 없습니다. 나는 그들에게 접근 할 수있는 소스 코드조차 없다고 생각한다. 누군가는 주어진 GUI에 대한 Visual Basic 이름을 읽는 데 사용할 수있는 툴이 있다고 말했고 일부 GUI 테스트 툴 역시 이것을 할 수 있습니다 - 그래서 어떻게 든 가능해야합니다. –

관련 문제