找回密码
 加入
搜索
楼主: heroxianf

[AU3基础] VBA能否列出已打开的所有EXCEL表格名称[已解决]

 火.. [复制链接]
 楼主| 发表于 2016-12-11 11:44:36 | 显示全部楼层
回复 14# kevinch

默认是单进程工作的,  多进程需要修改注册表,不过多进程可以直接对窗口进行检查。谢谢Kevinch了。我下来试试如果加代码里。
 楼主| 发表于 2016-12-11 11:57:56 | 显示全部楼层
回复 14# 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[0][0]
        If StringInStr(StringLower($wins[$n][1]),"excel7")>0 Then
                $excelwin=_Acc_AccessibleObjectFromWindow($wins[$n][0])
                $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[4]
        EndIf
        Return SetError(@error, 2, 0)
EndFunc   ;==>_Acc_AccessibleObjectFromWindow
这个试下吧,api不熟,只能写成这样了
 楼主| 发表于 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[0][0]
                        If _WinAPI_GetWindowText($aArray[$n][0]) = $RecordExcelFileName And StringInStr($aArray[$n][1], 'EXCEL') Then
                                $RecordHwd = $aArray[$n][0]
                                ExitLoop
                        EndIf
                Next
        Else
                Return SetError(2, 0, 0)
        EndIf
        Local $ExcelHwd = WinGetHandle('[CLASS:XLMAIN]')
        Local $List = _WinAPI_EnumChildWindows($ExcelHwd)
        If Not IsArray($List) Then Return SetError(ProcessClose('excel.exe'), 0, 0)
        Return SetError(0, 0, 1)
EndFunc   ;==>GetControlHandleList
发表于 2016-12-17 15:40:15 | 显示全部楼层
回复 18# kevinch

这个可以。不明白此处为什么用“excel7” ?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-25 11:06 , Processed in 0.065030 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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