默认是单进程工作的,多进程需要修改注册表,不过多进程可以直接对窗口进行检查。谢谢Kevinch了。我下来试试如果加代码里。 回复 14# kevinch
默认是单进程工作的,多进程需要修改注册表,不过多进程可以直接对窗口进行检查。谢谢Kevinch了。我下来试试如果加代码里。
测试了一下,完全通过,那针对有的人设置了多进程,可不可以设置对同名的进程循环检查呢? #include <winapi.au3>
Local $dic=ObjCreate("scripting.dictionary")
Local $wins=_WinAPI_EnumWindows(False)
Global $str=""
For $n=1 To $wins
If StringInStr(StringLower($wins[$n]),"excel7")>0 Then
$excelwin=_Acc_AccessibleObjectFromWindow($wins[$n])
$excelapp=$excelwin.application
If Not $dic.exists(String($excelapp.hwnd)) Then
$dic(String($excelapp.hwnd))=""
$str&="Excel进程"&$dic.count
_GetWorkbookInfo($excelapp)
EndIf
EndIf
Next
If $dic.count=0 Then $str="未找到Excel进程!"&@CRLF
$dic=0
ConsoleWrite($str)
Func _GetWorkbookInfo($app)
Local $n=$app.workbooks.count
If $n>0 Then
$str&="已打开工作簿数量:"&$n&@CRLF
For $i=1 To $n
$str&=@tab&"工作簿"&$i&"的全路径是:"""&$app.workbooks($i).fullname&@CRLF
With $app.workbooks($i)
For $t=1 To .sheets.count
$str&=@TAB&@TAB&.sheets($t).name&@CRLF
Next
EndWith
Next
Else
$str&="未打开任何工作簿!"&@CRLF
EndIf
EndFunc
Func _Acc_AccessibleObjectFromWindow($hWnd);由窗口句柄获取Accessible对象;
If IsHWnd($hWnd) Then
Local $sIID_IAccessible = "{00020400-0000-0000-C000-000000000046}"
Local $tGUID = _WinAPI_GUIDFromString($sIID_IAccessible)
If @error Then Return SetError(@error, 0, 0)
Local $pGUID = DllStructGetPtr($tGUID)
Local $aResult = DllCall("oleacc.dll", "int", "AccessibleObjectFromWindow","hwnd", _
$hWnd, "dword",0xfffffff0, "ptr", $pGUID, "idispatch*", 0)
If @error Then Return SetError(@error, 1, 0)
Return $aResult
EndIf
Return SetError(@error, 2, 0)
EndFunc ;==>_Acc_AccessibleObjectFromWindow这个试下吧,api不熟,只能写成这样了 本帖最后由 heroxianf 于 2016-12-17 12:25 编辑
回复 18# kevinch
这是海大给我的检测代码,虽然看不太懂,但是可以搞定,分享给你了。
Func GetControlHandleList()
Local $aArray, $n
$aArray = _WinAPI_EnumWindows()
If Not @error Then
For $n = 1 To $aArray
If _WinAPI_GetWindowText($aArray[$n]) = $RecordExcelFileName And StringInStr($aArray[$n], 'EXCEL') Then
$RecordHwd = $aArray[$n]
ExitLoop
EndIf
Next
Else
Return SetError(2, 0, 0)
EndIf
Local $ExcelHwd = WinGetHandle('')
Local $List = _WinAPI_EnumChildWindows($ExcelHwd)
If Not IsArray($List) Then Return SetError(ProcessClose('excel.exe'), 0, 0)
Return SetError(0, 0, 1)
EndFunc ;==>GetControlHandleList 回复 18# kevinch
这个可以。不明白此处为什么用“excel7” ?
页:
1
[2]