【问题标题】:Running multiple identical applications运行多个相同的应用程序
【发布时间】:2017-09-29 10:29:47
【问题描述】:

告诉我为什么它不起作用?我进行了搜索,但没有找到如何运行几个相同的应用程序,以便您可以分别使用每个应用程序。
脚本工作,启动第一个窗口,移动它,然后第二个窗口启动,第一个窗口沿着第二个坐标移动,第二个不移动。有什么问题?

Run('c:\Program Files\CPUID\CPU-Z\cpuz.exe')
$hWnd = WinWait("[TITLE:CPU-Z; INSTANCE:1]", "", 0)
If Not $hWnd Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf
Sleep(400)
WinMove($hWnd, "", 0, 645)

Run('c:\Program Files\CPUID\CPU-Z\cpuz.exe')
$hWnd2 = WinWaitActive("[TITLE:CPU-Z; INSTANCE:2]", "", 0)
If Not $hWnd2 Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf
Sleep(400)
WinMove($hWnd2, "", 405, 645)


如何正确编写这样的脚本?

【问题讨论】:

  • 也许从 Run() 获取 pid 并使用它来获取正确的 hWnd? ref
  • 在 WinWait 中,超时“0”没有意义。您可以使用类似 15 的内容。在您的第二个语句中,我还将使用 WinWait(不是 WinWaitActive)。获取窗口后,您可以使用 WinActivate。
  • @ReFran 是的,但我放了 0,因为程序可以在加载上花费不同的时间
  • 如果设置为 0 则没有等待时间。您必须使用更长的等待时间,例如 30 秒。在此等待时间内,系统会被轮询。每 250 毫秒查看请求的程序是否已启动。 30 秒后。等待/轮询过程将完成,您必须注意结果(成功或失败)
  • @ReFran,0 表示没有超时,检查documentation。它与“直到窗口存在才会继续”相同,可以通过WinWait("Garbage_not_matching_any_title", "", 0) 轻松检查,因此当前使用情况很好

标签: windows automation windows-10 autoit


【解决方案1】:

...第二个不动。有什么问题?

脚本生成相同的$hWnd$hWnd2 绑定到初始窗口,您可以通过输出带有MsgBox()_DebugOut() 或任何您喜欢的变量来检查。看起来 INSTANCE 属性在当前情况下无法正常工作,因此WinWait() 仅使用标题搜索窗口,第二次调用找到与第一个相同的窗口。

如何正确编写这样的脚本?

好吧,我有不到一周的 AutoIt 经验,所以不要打击我,但这是我的版本:

Run('c:\Program Files\CPUID\CPU-Z\cpuz.exe')

Global $hWnd = WinWait("CPU-Z", "", 0)
If Not $hWnd Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf
Sleep(400)
WinMove($hWnd, "", 0, 645)

Run('c:\Program Files\CPUID\CPU-Z\cpuz.exe')
Global $hWnd2 = Null

;wait until there are two windows with the same title
Do
Sleep(10)
Global $aList = WinList("CPU-Z")
Until $aList[0][0] > 1 

For $i = 1 To $aList[0][0]
    If $aList[$i][1] <> $hWnd Then
        $hWnd2 = $aList[$i][1]
    EndIf
Next

If Not $hWnd2 Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf
Sleep(400)
WinMove($hWnd2, "", 405, 645)

编辑

奖励:将脚本的重复部分打包到函数中,以便在多个窗口中使用:

Global $aKnownHandles[1]       ;array storing all known win handles
Global $iCounter = 0           ;keeps track of array size

AddInstance(0, 645)
AddInstance(405, 645)
AddInstance(810, 645)
AddInstance(1215, 645)

AddInstance(0, 345)
AddInstance(405, 345)
AddInstance(810, 345)
AddInstance(1215, 345)

AddInstance(0, 50)
AddInstance(405, 50)
AddInstance(810, 50)
AddInstance(1215, 50)

Func AddInstance($x, $y)
    Run('c:\Program Files\CPUID\CPU-Z\cpuz.exe')

    Do
        Sleep(1)
        Local $aWinList = WinList("CPU-Z")
    Until $aWinList[0][0] > $iCounter

    Local $hNewHandle = Null

    ;for each handle in list of windows ($aWinList)
    ;check if it matches any item in list of known handles ($aKnownHandles)
    ;If not, put handle into $hNewHandle variable
    For $i = 1 To $aWinList[0][0]
        Local $bHandleKnown = false
        For $j = 0 To $iCounter-1
            If $aWinList[$i][1] == $aKnownHandles[$j] Then
                $bHandleKnown = true
                ExitLoop
            EndIf
        Next

        If NOT $bHandleKnown Then
            $hNewHandle = $aWinList[$i][1]
            ExitLoop
        EndIf
    Next

    If Not $hNewHandle Then
        MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
        Exit
    EndIf

    Sleep(400)
    WinMove($hNewHandle, "", $x, $y)

    ReDim $aKnownHandles[$iCounter+1]       ;resize array
    $aKnownHandles[$iCounter] = $hNewHandle ;add new handle to list of known
    $iCounter += 1                          ;update counter
EndFunc

【讨论】:

  • 非常感谢,它可以工作,但是如果我需要移动两个或更多窗口怎么办?然后呢?我认为这种方式行不通
  • 不明白您的顾虑。如果您需要在知道两个现有窗口的句柄的同时获取第三个创建的窗口的句柄,算法是绝对相同的:获取具有相同标题的窗口列表,将它们的句柄与已知句柄进行比较。一个句柄与任何现有句柄都不匹配,因此应将其保存为$hWnd3。一般来说,如果您有 n 个已知句柄,则打开第 (n+1) 个窗口,将发现的句柄列表与已知句柄列表进行比较。一个新的句柄匹配新打开的窗口。
  • 我按照你的比喻做了,但是我没有找到第三个窗口,我做错了什么? pastebin.com/1QyRuwfV
  • 第二个for 格式错误。 1) 使用For $i = 1 To $aList[0][0] 遍历所有窗口 2) 正确比较窗口句柄$aList[$i][1] &lt;&gt; $hWnd AND $aList[$i][1] &lt;&gt; $hWnd2
  • 顺便说一句,如果你需要处理很多窗口,脚本的重复部分可以很容易地打包到一个函数中,这样创建/移动十几个窗口就不会乏味了。但是对于少数情况下,代码不太复杂,因此更易于理解的代码是首选恕我直言。
猜你喜欢
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2021-11-18
相关资源
最近更新 更多