找回密码
 加入
搜索
查看: 2240|回复: 8

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

  [复制链接]
发表于 2016-4-9 22:22:02 | 显示全部楼层 |阅读模式
本帖最后由 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[0][0]
        Local $pid = WinGetProcess($var[$i][1])
         If $pid = $PID1 Then

                WinSetState($var[$i][1], "", @SW_MAXIMIZE)
                Local $handle = $var[$i][1]
                Send("!4")
                Send("{DOWN}{DOWN}{ENTER}")
                WinActivate($handle)
                ControlClick($handle, "", "TPageControl1", "left", 1, 27, 9)
        EndIf
Next
发表于 2016-4-9 22:34:20 | 显示全部楼层
ProcessWait('进程名不是id')
发表于 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[0][0]
                If $var[$i][0] <> "" And IsVisible($var[$i][1]) Then
                        Local $pid = WinGetProcess($var[$i][1])
                        If $pid = $PID1 Then
                                Return $var[$i][1]
                        EndIf
                EndIf
        Next
EndFunc   ;==>_ProcessHandleToWinHandle
Func IsVisible($handle)
        If BitAND(WinGetState($handle), 2) Then
                Return 1
        Else
                Return 0
        EndIf

EndFunc   ;==>IsVisible
发表于 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
 楼主| 发表于 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] = 0 Then Return SetError(1, 0, '')
                Local $vStruct = DllStructCreate('int[1024]')
                DllCall('psapi.dll','int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
                Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
        If StringLen($aReturn[3]) = 0 Then Return SetError(2, 0, '')
        Return $aReturn[3]
EndFunc




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

        If Processpath($PID1)="C:\HsOrganClient.exe" Then ;8999
                                               
                                                Local $handle = $var[$i][1]
                                                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][1]
                                                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
 楼主| 发表于 2016-4-10 10:31:46 | 显示全部楼层
问题已经解决。
 楼主| 发表于 2016-4-10 11:01:34 | 显示全部楼层
zldfsz 给的代码中
我将
If $var[$i][0] <> "" And IsVisible($var[$i][1]) Then
这个判断去掉后程序可以运行自动操作了。
 楼主| 发表于 2016-4-10 11:26:08 | 显示全部楼层
还有个问题是下边的操作
ControlClick("$Winhandle", "", "TPageControl1", "left", 1, 27, 9)
加上句柄$Winhandle是不能运行的,去掉就可以运行
ControlClick("", "", "TPageControl1", "left", 1, 27, 9)
这样不稳定吧?
发表于 2016-4-16 23:38:13 | 显示全部楼层
还有个问题是下边的操作
ControlClick("$Winhandle", "", "TPageControl1", "left", 1, 27, 9)
加上句柄 ...
ccsc006 发表于 2016-4-10 11:26



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


BTW:回复或追问非楼主的帖子需要在他下点“击回复“或”引用“进行回复,否则别人收不到通知;
如果问题解决了请编辑帖子在标题上加上【已解决】字样
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-29 04:15 , Processed in 0.086612 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表