Активировать между несколькими экземплярами Internet Explorer

Можно ли использовать wshshell.appactivate для переключения между несколькими окнами Internet Explorer?

Я пытаюсь написать сценарий, который выведет разные экземпляры Internet Explorer в режиме киоска на передний план. Конечная цель - сделать так, чтобы все выглядело так, как будто вы переходите с одной веб-страницы на другую. Я попытался использовать wshshell.sendkey, но он не выглядит гладким, когда открывается диалоговое окно открытой веб-страницы.

2 ответа

Я играл с этим в течение нескольких дней. Мы можем получить hwnd от IE, но не PID. Таким образом, единственный способ сопоставить HWnd и PID - это вызов Win32API. Так как это сделать в VBS.

На всех компьютерах установлено 4 компилятора VB.NET. Так что все, что нам нужно сделать, это написать com-сервер, который упаковывает GetWindowThreadProcessId.

В вашем скрипте запишите следующую строку в текстовый файл. Я изменил сценарий для этого, поэтому имена методов глупы.

Imports System
Imports System.Runtime.InteropServices
Imports Microsoft.Win32
Imports System.Net.Mail



Namespace SendMail

    <Guid("85B4AD6D-2E89-4869-9BBC-69E42738FCFC"), _
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
   Public Interface _SendMail
        <DispId(1)> Function Send(ByVal hWnd As Integer) As Integer
    End Interface

    <Guid("C91EDEB2-3756-4893-905B-0E4E2150C7FD"), _
     ClassInterface(ClassInterfaceType.None), _
     ProgId("Scripting.SendMail")> Public Class SendMail
        Implements _SendMail

        Public SendMail()
        Public Declare Auto Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As Integer, ByRef lpdwProcessId As Integer) As Integer

        Public Function Send(HWnd as Integer) As Integer Implements _SendMail.Send
            Dim X as Integer
            Dim M as Integer
    M=1

            X=GetWindowThreadProcessID(HWnd,M)
            msgbox(X & " " & M & " " & HWnd & " " & Err.LastDllError)
            Send = M

        End Function

    End Class

End Namespace

Затем для компиляции WSHShell. Запустите следующие команды скрытых путей исправления.

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /target:library /out:"%userprofile%\desktop\sendmail\sendmail.dll" "%userprofile%\desktop\sendmail\sendmail.cls" /verbose


"C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm" /codebase "%userprofile%\desktop\sendmail\sendmail.dll" /tlb:"%userprofile%\desktop\sendmail\sendmail.tlb" /v

Затем использовать в сценарии

Set x = CreateObject("Scripting.SendMail")
Msgbox x.Send(&h1a013e)

Теперь я сгенерировал GUID для этой цели создания com-объектов на лету. Так как они сейчас находятся в общедоступном коде, вы (И ЛЮБОЕ ДРУГОЕ КОПИРОВАНИЕ ЭТОГО) должны уничтожить объект в вашем скрипте. Запустите команду Regasm с /u. Или сгенерируйте новые GUID.

Вы можете перечислить все окна проводника / интернет-обозревателя.

Из справки

Метод Windows


Создает и возвращает объект ShellWindows. Этот объект представляет собой коллекцию всех открытых окон, которые принадлежат командной консоли.

Синтаксис

oWindows = Shell.Windows()

Возвращаемое значение

Ссылка объекта на объект ShellWindows.

Примеры

В следующем примере Windows используется для извлечения объекта ShellWindows и отображения количества элементов, которые он содержит. Правильное использование показано для Microsoft JScript, Microsoft Visual Basic Scripting Edition (VBScript) и Visual Basic. VBScript:

Показать пример

<script language="VBScript">
    function fnShellWindowsVB()
        dim objShell
        dim objShellWindows

        set objShell = CreateObject("Shell.Application")
        set objShellWindows = objShell.Windows

        if (not objShellWindows is nothing) then
            alert(objShellWindows.Count)
        end if

        set objShellWindows = nothing
        set objShell = nothing
    end function
 </script>

Но я не знаю, как это поможет, если у них нет другого заголовка. Appactivate - единственная команда управления окнами, доступная для сценариев.

Также appactivate возвращает значение, говорящее, активировало ли оно окно или нет. Если вы попытаетесь активировать активное окно, оно завершится неудачей, так как окно уже активно.

Вы можете переключаться между процессами, но обычно веб-страницы находятся в одном процессе. AppActivate принимает PID

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")

For Each objItem in colItems
    msgbox objItem.ProcessID & " " & objItem.Caption
Next
Другие вопросы по тегам