Получить экземпляр окна / объект из дескриптора (hWnd) - PullRequest
0 голосов
/ 29 февраля 2020

Работая в VB / VBA, у меня есть дескриптор окна, и мне нужно преобразовать его в объект / экземпляр окна, который я могу использовать для доступа к свойствам объекта окна.

AccessibleObjectFromWindow не доказал свою полезность.

Как мне это сделать?

Обновление

Ниже приведены дополнительные сведения.

Я работаю с окном, созданным с помощью mshta.exe и настроенным с некоторыми scripts:

CreateObject("WScript.Shell").Run "%systemroot%\syswow64\mshta.exe about:""<head><script>moveTo(-32000,-32000);document.title='" & x86WindowSignature & "'</script><hta:application showintaskbar=no /><object id='shell' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shell.putproperty('" & x86WindowSignature & "',document.parentWindow);</script></head>""", 0, False

        For Each Window In CreateObject("Shell.Application").Windows
            On Error Resume Next
            Set Getx86Window = Window.GetProperty(x86WindowSignature)
            Error = Err.Number
            On Error GoTo 0
            If Error = 0 Then Exit For
            Pause 0.01, True
        Next Window

' Configure the window environment - global object variables are defined, one for each scripting object - they are instantiated by calling the Initialize routine
Getx86Window.execScript "var VBScript, JScript;"
Getx86Window.execScript "Sub Initialize() : Set VBScript = CreateObject(""MSScriptControl.ScriptControl"") : VBScript.Language = ""VBScript"" : Set JScript = CreateObject(""MSScriptControl.ScriptControl"") : JScript.Language = ""JScript"" End Sub", "VBScript"

' Initialize the window environment
Getx86Window.Initialize

x86WindowSignature - это функция, которая возвращает уникальную строку или ключ.

Я прохожу этот процесс, потому что Microsoft не предоставляет 64-битные версии VBScript и Механизмы JScript и этот процесс позволяют мне создавать 32-разрядные версии и использовать их из 64-разрядного мира.

Чтобы повторно использовать этот контейнер сценариев, мне нужно взглянуть на существующий windows и запросить одно из свойств Я создал:

Set Getx86Window = Window.GetProperty(x86WindowSignature)

Обычно я использую эту логику c, чтобы найти интересующее окно:

' Look for an existing window
For Each Window In CreateObject("Shell.Application").Windows
    On Error Resume Next
    Set Getx86Window = Window.GetProperty(x86WindowSignature)
    Error = Err.Number
    On Error GoTo 0
    If Error = 0 Then Exit Function
Next Window

Но, если приложение падает или не удается закрыть окно сценариев, оно остается открытым, но его нет в списке CreateObject («Shell.Application»). Windows.

Но я могу найти его с помощью FindWindow:

WindowHandle = API_FindWindow("HTML Application Host Window Class", x86WindowSignature)

I ' Я застрял, пытаясь преобразовать дескриптор окна в объектную переменную VB / VBA «Окно».

Я попытался просто скопировать память из переменной дескриптора в переменную объекта, но это не удалось.

1 Ответ

0 голосов
/ 05 марта 2020

Оказывается, я сделал неправильное наблюдение в моей первоначальной работе. Я думал, что я не получаю все 1007 * возвращенных мне, что я создал. Это неправда. Эта строка:

CreateObject("Shell.Application").Windows

всегда возвращает все windows, которые были созданы Shell.Application. Таким образом, я имел в своем распоряжении все windows, которые мое приложение создавало в прошлом.

Когда я задал свой вопрос, я подумал, что смогу получить только те «потерянные» оконные объекты, используя более низкий уровень Windows SDK вызывает, а затем каким-то образом конвертирует эти hWnds в ссылки на объекты окна Shell.Application. Я так и не понял, как это сделать, и возможно ли это, но в этом больше нет необходимости.

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