Как я могу получить имя элемента управления Visual Basic, учитывая его HWND? - PullRequest
2 голосов
/ 29 июля 2010

Я работаю над небольшим инструментом записи / воспроизведения макросов, который может автоматизировать несколько очень старых графических интерфейсов Visual Basic 6, которые у нас есть.Для этого я идентифицирую элементы управления по их имени (то есть по значению свойства name элемента управления).

Одна часть этого инструмента должна определить имя данного элемента управленияего HWND.Для более новых приложений Visual Basic, которые были сделаны с использованием VB.NET, я могу использовать сообщение окна WM_GETCONTROLNAME .Это хорошо работает.

Однако, это сообщение не понято старыми окнами.Есть ли способ сделать это для элементов управления приложениями Visual Basic 6?Решение, которое не требует присутствия в процессе графического интерфейса, было бы предпочтительным, но если бы у меня было решение, которое работает только внутри процесса графического интерфейса, то это также было бы приемлемо (поскольку я могу выполнить инъекцию самостоятельно).

ОБНОВЛЕНИЕ: Одна вещь, которую я только что попробовал, этот умеренный успех: я использовал AccessibleObjectFromWindow , чтобы проверить реализации интерфейса IAccessible объекта, который показываетданный HWND.В случае, если я получаю реализацию (кажется, что многие [все?] Элементы управления Visual Basic реализуют этот интерфейс), я использую свойство accName для считывания «доступного имени».Иногда это дает полезную строку, но обычно это не так.

Ответы [ 2 ]

1 голос
/ 30 июля 2010

Можете ли вы изменить приложения vb6?если это так, в каждом событии загрузки формы вы можете выполнять итерации me.controls и использовать API SetProp(ctrl.hwnd, "MYNAME:" & ctrl.name, 0) для добавления имени в собственный список свойств окна, тогда в другом приложении вы можете EnumProps(ctrl_HWND) искать то, которое начинается с MYNAME: и разобрать значение.

1 голос
/ 29 июля 2010

Я считаю, что единственным способом было бы попасть внутрь процесса и получить указатель на объект Form, но я не знаю, как это сделать извне.WM_GETCONTROLNAME для этих старых приложений?

Или, может быть, вы могли бы идентифицировать элементы управления с помощью некоторых других, изначально доступных свойств?не так уж много вы можете сделать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...