Активировать между несколькими экземплярами 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