ccsc006 发表于 2016-4-9 22:22:02

通过run命令得到的PID进程为什么在winlist里找不到【已解决】

本帖最后由 ccsc006 于 2016-7-12 11:19 编辑

如下边的脚本。
$PID1 = Run("C:\HsOrganClient.exe") ;赋值给PID1
1、$PID1 = Run("C:\HsOrganClient.exe")第一次运行之外,一直没有 $pid = $PID1 的情况出现。相当于第二次之后if里没有运行过。
$PID1 = Run("C:\HsOrganClient.exe")在第二次之后不再开新程序窗口,但pid1的值都不一样。
2、我们这没有运行几个HsOrganClient.exe,只是目录不同,一般都是运行状态的。还有什么其他赋值的方法? 而不用$PID1 = Run("C:\HsOrganClient.exe")

;=============================
$PID1 = Run("C:\HsOrganClient.exe")
ProcessWait ($PID1)
$var = WinList()

For $i = 1 To $var
      Local $pid = WinGetProcess($var[$i])
       If $pid = $PID1 Then

                WinSetState($var[$i], "", @SW_MAXIMIZE)
                Local $handle = $var[$i]
                Send("!4")
                Send("{DOWN}{DOWN}{ENTER}")
                WinActivate($handle)
                ControlClick($handle, "", "TPageControl1", "left", 1, 27, 9)
      EndIf
Next

afan 发表于 2016-4-9 22:34:20

ProcessWait('进程名不是id')

zldfsz 发表于 2016-4-10 08:21:15

$PID1 = Run("C:\HsOrganClient.exe")
While 1
        $Winhandle = _ProcessHandleToWinHandle($PID1)
        If IsHWnd($Winhandle) Then ExitLoop
WEnd
WinSetState($Winhandle, "", @SW_MAXIMIZE)
Send("!4")
Send("{DOWN}{DOWN}{ENTER}")
WinActivate($Winhandle)
ControlClick($Winhandle, "", "TPageControl1", "left", 1, 27, 9)

Func _ProcessHandleToWinHandle($PID1)
        $var = WinList()
        For $i = 1 To $var
                If $var[$i] <> "" And IsVisible($var[$i]) Then
                        Local $pid = WinGetProcess($var[$i])
                        If $pid = $PID1 Then
                                Return $var[$i]
                        EndIf
                EndIf
        Next
EndFunc   ;==>_ProcessHandleToWinHandle
Func IsVisible($handle)
        If BitAND(WinGetState($handle), 2) Then
                Return 1
        Else
                Return 0
        EndIf

EndFunc   ;==>IsVisible

h20040606 发表于 2016-4-10 10:22:12

本帖最后由 h20040606 于 2016-4-11 21:31 编辑

回复 1# ccsc006


    1 processwait的参数不是id
    2 因为执行winlist的时候,窗口还没有建立。需要等待一定的时间。
      请在前面加上sleep等待

参考http://www.autoitx.com/thread-21221-1-1.html

ccsc006 发表于 2016-4-10 10:31:01

谢谢各位朋友的回复。代码一会测一下。

今天又找了一个这样的自定义函数,在我的程序已经运行的情况下跑起来正常。
供大家学习参考
Func Processpath($iPID)
        ;通过API获取指定PID的进程路径
        ;官方牛人制作
        Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
        If $aProc = 0 Then Return SetError(1, 0, '')
                Local $vStruct = DllStructCreate('int')
                DllCall('psapi.dll','int', 'EnumProcessModules', 'hwnd', $aProc, 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
                Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc, 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
        If StringLen($aReturn) = 0 Then Return SetError(2, 0, '')
        Return $aReturn
EndFunc




$var = WinList("")
For $i = 1 To $var
    Local $pid1 = WinGetProcess($var[$i])
        ;MsgBox(64,"进程信息","进程路径是:"&Processpath($PID1))

        If Processpath($PID1)="C:\HsOrganClient.exe" Then ;8999
                                               
                                                Local $handle = $var[$i]
                                                MsgBox(0,0,$handle)
                                                ;WinSetState($handle, "",@SW_MAXIMIZE)
                                                WinActivate($handle)
                                               
                                                                If WinActive($handle, "") Then
                                                                                Send("!4")
                                                                                Send("{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}")
                                                                                WinWaitActive($handle)
                                                                                ControlClick($handle, "", "TPageControl1", "left", 1, 27, 9)

                                                                EndIf                                                                                               
                                                                               

        endif
       
       

        If Processpath($PID1)="C:\test\HsOrganClient.exe" Then
                                               
                                                Local $handle = $var[$i]
                                                MsgBox(0,0,$handle)
                                                ;WinSetState($handle, "",@SW_MAXIMIZE)
                                                WinActivate($handle)
                                               
                                                                If WinActive($handle, "") Then
                                                                        Send("!4")
                                                                        Send("{ENTER}")
                                                                        WinWaitActive($handle)
                                                                        ControlClick($handle, "", "TPageControl1", "left", 1, 75, 10)

                                                                EndIf


                                               
        endif
                                       
        Next

ccsc006 发表于 2016-4-10 10:31:46

问题已经解决。

ccsc006 发表于 2016-4-10 11:01:34

zldfsz 给的代码中
我将
If $var[$i] <> "" And IsVisible($var[$i]) Then
这个判断去掉后程序可以运行自动操作了。

ccsc006 发表于 2016-4-10 11:26:08

还有个问题是下边的操作
ControlClick("$Winhandle", "", "TPageControl1", "left", 1, 27, 9)
加上句柄$Winhandle是不能运行的,去掉就可以运行
ControlClick("", "", "TPageControl1", "left", 1, 27, 9)
这样不稳定吧?

zldfsz 发表于 2016-4-16 23:38:13

还有个问题是下边的操作
ControlClick("$Winhandle", "", "TPageControl1", "left", 1, 27, 9)
加上句柄 ...
ccsc006 发表于 2016-4-10 11:26 http://www.autoitx.com/images/common/back.gif


    不稳定?变量$Winhandle怎么加上引号了,我代码里面可是ControlClick($Winhandle, "", "TPageControl1", "left", 1, 27, 9)

BTW:回复或追问非楼主的帖子需要在他下点“击回复“或”引用“进行回复,否则别人收不到通知;
如果问题解决了请编辑帖子在标题上加上【已解决】字样
页: [1]
查看完整版本: 通过run命令得到的PID进程为什么在winlist里找不到【已解决】