heroxianf 发表于 2016-12-11 11:44:36

回复 14# kevinch

默认是单进程工作的,多进程需要修改注册表,不过多进程可以直接对窗口进行检查。谢谢Kevinch了。我下来试试如果加代码里。

heroxianf 发表于 2016-12-11 11:57:56

回复 14# kevinch

默认是单进程工作的,多进程需要修改注册表,不过多进程可以直接对窗口进行检查。谢谢Kevinch了。我下来试试如果加代码里。

测试了一下,完全通过,那针对有的人设置了多进程,可不可以设置对同名的进程循环检查呢?

kevinch 发表于 2016-12-17 11:19:30

#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:03:24

本帖最后由 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

h20040606 发表于 2016-12-17 15:40:15

回复 18# kevinch

这个可以。不明白此处为什么用“excel7” ?
页: 1 [2]
查看完整版本: VBA能否列出已打开的所有EXCEL表格名称[已解决]