通过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 ProcessWait('进程名不是id') $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-11 21:31 编辑
回复 1# ccsc006
1 processwait的参数不是id
2 因为执行winlist的时候,窗口还没有建立。需要等待一定的时间。
请在前面加上sleep等待
参考http://www.autoitx.com/thread-21221-1-1.html 谢谢各位朋友的回复。代码一会测一下。
今天又找了一个这样的自定义函数,在我的程序已经运行的情况下跑起来正常。
供大家学习参考
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 问题已经解决。 zldfsz 给的代码中
我将
If $var[$i] <> "" And IsVisible($var[$i]) Then
这个判断去掉后程序可以运行自动操作了。 还有个问题是下边的操作
ControlClick("$Winhandle", "", "TPageControl1", "left", 1, 27, 9)
加上句柄$Winhandle是不能运行的,去掉就可以运行
ControlClick("", "", "TPageControl1", "left", 1, 27, 9)
这样不稳定吧? 还有个问题是下边的操作
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]