在多个Internet Explorer实例之间进行appactivate

时间:2014-04-30 19:07:10

标签: internet-explorer batch-file vbscript

是否可以使用wshshell.appactivate在多个Internet Explorer窗口之间切换?

我正在尝试编写一个脚本,它将在自助服务终端模式中将不同的Internet Explorer实例带到前面。最终目标是让它看起来像从一个网页到另一个网页。我尝试使用wshshell.sendkey但是弹出的网页对话框看起来并不顺畅。

2 个答案:

答案 0 :(得分:1)

我玩了几天。我们可以从IE获得一个hwnd,但不是PID。因此,我可以看到将HWnd与PID匹配的唯一方法是调用Win32API调用。那么如何在VBS中做到这一点。

所有计算机都安装了4个VB.NET编译器。所以我们需要做的就是编写一个包装GetWindowThreadProcessId的com服务器。

在您的脚本中,将以下行写入文本文件。为此重新设置了一个不同的脚本,所以方法名称很愚蠢。

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.Run以下命令隐藏修复路径。

"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)

现在,我已经为了动态创建com对象而生成了GUID。因为它们现在是公共代码,你(并且任何人都要复制)必须销毁脚本中的对象。使用/ u运行Regasm命令。或者生成新的GUID。

答案 1 :(得分:0)

您可以枚举所有资源管理器/ Internet Explorer窗口。

来自帮助

Windows方法


创建并返回ShellWindows对象。此对象表示属于命令行管理程序的所有打开窗口的集合。

语法

oWindows = Shell.Windows()

返回值

对ShellWindows对象的对象引用。

实施例

以下示例使用Windows检索ShellWindows对象并显示其包含的项目数。适用于Microsoft JScript,Microsoft Visual Basic Sc​​ripting 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是脚本可用的唯一Windows管理命令。

同样,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