Windows 运行多个相同的应用程序

Windows 运行多个相同的应用程序,windows,automation,windows-10,autoit,Windows,Automation,Windows 10,Autoit,告诉我为什么它不起作用?我搜索了,但没有找到如何运行几个相同的应用程序,以便您可以分别使用每个应用程序。 脚本工作,启动第一个窗口,移动它,然后第二个窗口启动,第一个窗口沿第二个坐标移动,第二个窗口不移动。有什么问题 Run('c:\Program Files\CPUID\CPU-Z\cpuz.exe') $hWnd = WinWait("[TITLE:CPU-Z; INSTANCE:1]", "", 0) If Not $hWnd Then MsgBox(4096, 'Сообщен

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

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('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)
脚本生成与初始窗口绑定的相同的
$hWnd
$hWnd2
,您可以通过使用
MsgBox()
\u DebugOut()
或任何您喜欢的方式输出变量来进行检查。看起来,实例属性在当前场景中无法正常工作,因此,
WinWait()
仅使用title搜索窗口,第二个调用会找到与第一个相同的窗口

如何正确编写这样的脚本

嗯,我的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)

也许可以从Run()获取pid并使用它来获取正确的hWnd?在WinWait中,超时“0”没有意义。你可以用15个。在您的第二个语句中,我还将使用WinWait(不是WinWaitActive)。获取窗口后,您可以使用WinActivate。@ReFran yes,但我将其设置为0,因为程序可以在加载上花费不同的时间。如果设置为0,则没有等待时间。您必须使用更高的等待时间,如30秒。在此等待时间内,系统每隔250毫秒轮询一次,以查看请求的程序是否启动。30秒后。等待/轮询过程将完成,您必须处理结果(成功或失败)@ReFran,0表示无超时,请检查。它与“在窗口存在之前不会继续”相同,并且可以通过
WinWait(“垃圾”不匹配任何标题),“,”,0)
轻松检查,因此当前的用法很好谢谢,它很有效,但是如果我需要移动两个或多个窗口怎么办?我认为这种方式行不通,我不理解你的担忧。如果您需要为第三个创建的窗口获取句柄,同时知道两个现有窗口的句柄,那么algo是完全相同的:获取具有相同标题的窗口列表,将它们的句柄与已知句柄进行比较。一个句柄与任何现有句柄都不匹配,因此应将其另存为
$hWnd3
。一般来说,如果您有n个已知句柄,然后打开(n+1)个窗口,将发现的句柄列表与已知句柄列表进行比较。一个新的手柄与新打开的窗口相匹配。根据你的类比,我找到了,但我没有找到第三个窗口,我做错了什么?的第二个
格式不正确。1) 使用
For$i=1到$aList[0][0]
2)在所有窗口上迭代,正确比较窗口句柄
$aList[$i][1]$hWnd和$aList[$i][1]$hWnd2
。顺便说一句,如果需要处理大量窗口,脚本的重复部分可以轻松打包到一个函数中,因此创建/移动十几个窗口不会很乏味。但对于少数实例,IMHO更倾向于使用不太复杂、因而更易于理解的代码。