Работая в 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 «Окно».
Я попытался просто скопировать память из переменной дескриптора в переменную объекта, но это не удалось.