运行 多个相同的应用程序

Running multiple identical applications

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

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)


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

...and the second one does not move. What is the problem?

脚本生成与初始 window 绑定的相同 $hWnd$hWnd2,您可以通过使用 MsgBox()_DebugOut() 或其他任何输出变量来检查你喜欢。看起来 INSTANCE 属性 在当前情况下效果不佳,因此 WinWait() 仅使用标题搜索 window 并且第二次调用找到相同的 window作为第一个。

How to correctly write such a script?

好吧,我只有不到一周的 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)

编辑

奖励:将脚本的重复部分打包到函数中,以便于多个 windows:

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