ๆฆ่ฆ
- VBAใงUIAutomationใ็จใใฆใUI่ฆ็ด ใ่ชฟในใใใใฎใฝใผในใณใผใใงใใไปฅไธใฎๅ็ปใงไฝฟใใใฆใใใใฎใงใใ
ใพใใไปฅไธใฎๅ็ปใๅใใใฆ็ขบ่ชใใใจใใใใใใใใจๆใใพใใ
ๅไฝๅใฎ่จญๅฎ
ๅฎ่ก็ฐๅข
ไปฅไธใฎ็ฐๅขใงๅไฝ็ขบ่ชใใใพใใใ
- Windows11ใงใฎExcel 2021
ๆณจๆ็น
- ใใญใฐใฉใ ใฎๅฎ่กใซใคใใฆใฏใใในใฆ่ชๅทฑ่ฒฌไปปใง่กใฃใฆใใ ใใใๅฎ่กใซใใ็บ็ใใใใใใชใ็ดๆฅ็ใพใใฏ้ๆฅ็่ขซๅฎณใซใคใใฆใไฝ่ ใฏใใฎ่ฒฌไปปใ่ฒ ใใพใใใ
ใณใผใใฎ็ฐกๅใช่งฃ่ชฌ
ใใญใฐใฉใ ใฎๅคงใพใใชๆตใใฏไปฅไธใฎใจใใใงใใ
- ใฆใคใณใใฆๅใใใฆใคใณใใฆใใณใใซใๅๅพ
- ใฆใคใณใใฆๅ ใฎใในใฆใฎ่ฆ็ด ใๅๅพ
- ใใใใใฎ่ฆ็ด ใฎๅๅใใณใณใใญใผใซใฟใคใใใใใใฐใใ
ๅฎ่กๆนๆณ
ๅฎ่กๆใฏใCheckAllElementsWithUIAutomationใใตใใใญใทใผใธใฃๅ ใฎใCall GetAllElements(ใ,ใ)ใใฎๅผๆฐใๆๅฎใใฆใๅฝ่ฉฒใใญใทใผใธใฃใๅฎ่กใใพใใ
็ฌฌไธๅผๆฐ๏ผๅฟ ้ ๏ผใฏใใฆใฃใณใใฆๅ๏ผๅๅใฎไธ้จใงใๅฏ่ฝ๏ผใๆๅฎใใฆใใ ใใใๅใใฆใฃใณใใฆๅใฎใใฎใไบใคไปฅไธ้ใใใฆใใชใใใจใ็ขบ่ชใใฆใใ ใใใ
็ฌฌไบๅผๆฐ๏ผ็็ฅๅฏ่ฝ๏ผใฏใ่ฆ็ด ๅใๅ ฅๅใใฆใใ ใใใ็ฌฌไบๅผๆฐใๆๅฎใใใจใๅฝ่ฉฒ่ฆ็ด ๅใๅซใ่ฆ็ด ใๅบ็พใใ้ใซใใใญใทใผใธใฃใฎๅฎ่กใๆญขใพใใพใใ
ๅฎ่กไพ
- ใณใผใใซ่จ่ผใใใฆใใใCall GetAllElements("Challenge", "ไฝๆ")ใใฏใ่จ่ผไพใงใใ
- ใใใๅฎ่กใใใจใใChallengeใใจใใๅๅใใคใๆๅใฎใฆใคใณใใฆใๅๅพใใใไฝๆใใจใใ่ฆ็ด ๅใฎใใฎใๅบ็พใใใใใใใฐใๆญขใพใใพใใ
โปใChallengeใใจใใๅๅใใคใใฆใคใณใใฆใ่คๆฐใชใใใจใ็ขบ่ชใใใใใงใๅฎ่กใใพใใ
ๅ่ญๅฅๅญใซใคใใฆ
- ControlTypeIdใฏไปฅไธใฎใตใคใใๅ็ งใใฆใ่จ่ผใใพใใใ
- ControlPatternใฏไปฅไธใฎใตใคใใใใใไฝฟใใใฎใๆ็ฒใใพใใใ
ใณใผใ_ver.2.0
Option Explicit
' GetNextWindow้ขๆฐใฎๅฎฃ่จ
Declare PtrSafe Function GetNextWindow Lib "user32" Alias "GetWindow" _
(ByVal hwnd As LongPtr, ByVal wFlag As Long) As LongPtr
' GetNextWindow้ขๆฐใฏใๆๅฎใใใใฆใฃใณใใฆใฎๆฌกใฎใฆใฃใณใใฆใฎใใณใใซใๅๅพใใ้ขๆฐใงใใ
' IsWindowVisible้ขๆฐใฎๅฎฃ่จ
Declare PtrSafe Function IsWindowVisible Lib "user32" _
(ByVal hwnd As LongPtr) As LongPtr
' IsWindowVisible้ขๆฐใฏใๆๅฎใใใใฆใฃใณใใฆใๅฏ่ฆ็ถๆ
ใใฉใใใๅคๅฎใใ้ขๆฐใงใใ
' GetWindowText้ขๆฐใฎๅฎฃ่จ
Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As Long) As LongPtr
' GetWindowText้ขๆฐใฏใๆๅฎใใใใฆใฃใณใใฆใฎใใญในใใๅๅพใใ้ขๆฐใงใใ
' FindWindow้ขๆฐใฎๅฎฃ่จ
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
' FindWindow้ขๆฐใฏใๆๅฎใใใใฏใฉในๅใใฆใฃใณใใฆๅใใใฆใฃใณใใฆใฎใใณใใซใๅๅพใใ้ขๆฐใงใใ
Dim hwnd As LongPtr ' ใฆใฃใณใใฆใฎใใณใใซใไฟๆใใๅคๆฐ
Const GW_HWNDLAST = 1 ' ๆๅพใฎใฆใฃใณใใฆ
Const GW_HWNDNEXT = 2 ' ๆฌกใฎใฆใฃใณใใฆ
' getWindowHandle้ขๆฐ๏ผ็ฌ่ช้ขๆฐ๏ผ
Function getWindowHandle(ByVal PartialWindowName As String) As LongPtr
Dim strCaption As String * 500 ' ใฆใฃใณใใฆใฎใใญในใใไฟๆใใๅคๆฐ
hwnd = FindWindow(vbNullString, vbNullString) ' ๆๅใฎใฆใฃใณใใฆใฎใใณใใซใๅๅพ
Dim cnt As Long ' ใซใฆใณใฟๅคๆฐ
cnt = 0
Dim cap As String ' ใฆใฃใณใใฆใฎใใญในใใไฟๆใใๅคๆฐ
Do
If IsWindowVisible(hwnd) Then ' ใฆใฃใณใใฆใๅฏ่ฆ็ถๆ
ใใฉใใใๅคๅฎ
GetWindowText hwnd, strCaption, Len(strCaption) ' ใฆใฃใณใใฆใฎใใญในใใๅๅพ
cap = Left(strCaption, InStr(strCaption, vbNullChar) - 1) ' ใใซๆๅญใพใงใฎ้จๅใๆฝๅบ
If InStr(cap, PartialWindowName) <> 0 Then ' ใฆใฃใณใใฆใฎใใญในใใซๆๅฎใฎๆๅญๅใๅซใพใใฆใใใใๅคๅฎ
getWindowHandle = hwnd ' ใฆใฃใณใใฆใฎใใณใใซใ่ฟใ
Exit Function ' ้ขๆฐใ็ตไบ
End If
End If
hwnd = GetNextWindow(hwnd, GW_HWNDNEXT) ' ๆฌกใฎใฆใฃใณใใฆใฎใใณใใซใๅๅพ
DoEvents ' ใคใใณใใๅฆ็
If hwnd = GetNextWindow(hwnd, GW_HWNDLAST) And cnt = 0 Then ' ๆๅพใฎใฆใฃใณใใฆใงๅๅใฎๅ ดๅ
cnt = 1
ElseIf hwnd = GetNextWindow(hwnd, GW_HWNDLAST) And cnt = 1 Then ' ๆๅพใฎใฆใฃใณใใฆใง2ๅ็ฎใฎๅ ดๅ
Debug.Print "ใฆใฃใณใใฆๅๅพใซๅคฑๆ" ' ใใใใฐใฆใฃใณใใฆใซใกใใปใผใธใๅบๅ
Application.Wait [Now()] + (1 / 86400) ' ใฆใฃใณใใฆใใณใใซๅคฑๆ็จใฎๅพ
ๆฉ
hwnd = FindWindow(vbNullString, vbNullString) ' ๆๅใฎใฆใฃใณใใฆใฎใใณใใซใๅๅพใ็ดใ
cnt = 0 ' ใซใฆใณใฟใใชใปใใ
End If
Loop
End Function
Function GetAllElements(ByVal PartialWindowName As String, Optional ByVal searchWord As String) As String
' UIAutomationใฎใคใณในใฟใณในใไฝๆ
Dim uiAuto As UIAutomationClient.CUIAutomation ' UIAutomationใฎใคใณในใฟใณในใๆ ผ็ดใใๅคๆฐ
Set uiAuto = New UIAutomationClient.CUIAutomation ' ๆฐใใUIAutomationใฎใคใณในใฟใณในใไฝๆ
' ใฆใฃใณใใฆใฎใใณใใซใๅๅพ
Dim hwnd As LongPtr ' ใฆใฃใณใใฆใฎใใณใใซใๆ ผ็ดใใๅคๆฐ
hwnd = getWindowHandle(PartialWindowName) ' ๆๅฎใใใ้จๅใฆใฃใณใใฆๅใฎใฆใฃใณใใฆใฎใใณใใซใๅๅพ
' ใฆใฃใณใใฆ่ฆ็ด ใๅๅพ
Dim elm01 As UIAutomationClient.IUIAutomationElement ' ใฆใฃใณใใฆ่ฆ็ด ใๆ ผ็ดใใๅคๆฐ
Set elm01 = uiAuto.ElementFromHandle(ByVal hwnd) ' ใฆใฃใณใใฆใฎใใณใใซใใUIAutomation่ฆ็ด ใๅๅพ
' ๆกไปถใไฝๆ
Dim uiCnd As IUIAutomationCondition ' ๆกไปถใๆ ผ็ดใใๅคๆฐ
Set uiCnd = uiAuto.CreateTrueCondition ' ็ใฎๆกไปถใไฝๆ๏ผCreateTrueConditionใฏใๅธธใซ็ใจใชใๆกไปถใไฝๆใใพใใ็นๅฎใฎๆกไปถใๆบใใ่ฆ็ด ใๆค็ดขใใใฎใงใฏใชใใๅ
จใฆใฎ่ฆ็ด ใๅๅพใใ้ใซๅฉ็จใใใพใใ๏ผ
' UIAutomationใฎ่ฆ็ด ใๆ ผ็ดใใใใใฎ้
ๅใๅฎฃ่จใใ่ฆ็ด ใๅๅพใใ
Dim aryElm As UIAutomationClient.IUIAutomationElementArray ' aryElmใฏUIAutomationใฎ่ฆ็ด ใๆ ผ็ดใใๅคๆฐ(้
ๅ)ใงใ
Set aryElm = elm01.FindAll(TreeScope_Subtree, uiCnd) ' elm01๏ผใฆใฃใณใใฆ่ฆ็ด ๏ผๅ
ใฎใตใใใชใผๅ
จไฝใใๆกไปถ๏ผuiCnd๏ผใซไธ่ดใใ่ฆ็ด ใๅๅพใใaryElmใซๆ ผ็ด
' ใใใใฐ็จใซใซใผใๅ
ใฎ่ฆ็ด ๆ
ๅ ฑใ่กจ็คบ
Dim i As Long
' aryElmๅ
ใฎๅ่ฆ็ด ใซๅฏพใใฆๅฆ็ใ่กใใซใผใ
For i = 0 To aryElm.Length - 1
Application.Wait [Now()] + (0.05 / 86400) ' ็ฐกๅใชใฆใงใคใ๏ผๅพ
ๆฉ๏ผใๆฟๅ
ฅใใใใจใงใๅฆ็ใใใฃใใ้ฒใใ
Debug.Print "i=" & i ' ใใใใฐ็จใซ็พๅจใฎใคใณใใใฏในใ่กจ็คบ
Debug.Print " ่ฆ็ด ๅ:" & aryElm.GetElement(i).CurrentName ' ใใใใฐ็จใซ่ฆ็ด ใฎๅๅใ่กจ็คบ
Call GetControlTypeByValue(aryElm.GetElement(i).CurrentControlType) ' ่ฆ็ด ใฎใณใณใใญใผใซใฟใคใใ่กจ็คบใใ้ขๆฐใๅผใณๅบใ
Call GetUIPatternAndDebug(aryElm.GetElement(i)) ' UI ใใฟใผใณใฎๆ
ๅ ฑใ่กจ็คบใใ้ขๆฐใๅผใณๅบใ
' ๆค็ดขใฏใผใใๆๅฎใใใฆใใใ่ฆ็ด ใฎๅๅใๆค็ดขใฏใผใใๅซใๅ ดๅใฏๅๆญข
If searchWord <> "" And InStr(aryElm.GetElement(i).CurrentName, searchWord) > 0 Then
Stop
End If
' ๆค็ดขใฏใผใใๆๅฎใใใฆใใชใๅ ดๅใ50ๅใใจใซๅๆญข
If searchWord = "" And i Mod 50 = 0 And i <> 0 Then
Stop
End If
Next i
End Function
Function GetControlTypeByValue(ByVal controlTypeCode As Long) As String
' ใณใณใใญใผใซๅ่ญๅฅๅญใฎๅค๏ผๆขๅฎๅค๏ผใใใณใณใใญใผใซใฎ็จฎ้กใฎๅๅใซๅคๆ
Select Case controlTypeCode
Case 50040
GetControlTypeByValue = "AppBar"
Case 50000
GetControlTypeByValue = "Button"
Case 50001
GetControlTypeByValue = "Calendar"
Case 50002
GetControlTypeByValue = "CheckBox"
Case 50003
GetControlTypeByValue = "ComboBox"
Case 50025
GetControlTypeByValue = "Custom"
Case 50028
GetControlTypeByValue = "DataGrid"
Case 50029
GetControlTypeByValue = "DataItem"
Case 50030
GetControlTypeByValue = "Document"
Case 50004
GetControlTypeByValue = "Edit"
Case 50026
GetControlTypeByValue = "Group"
Case 50034
GetControlTypeByValue = "Header"
Case 50035
GetControlTypeByValue = "HeaderItem"
Case 50005
GetControlTypeByValue = "Hyperlink"
Case 50006
GetControlTypeByValue = "Image"
Case 50008
GetControlTypeByValue = "List"
Case 50007
GetControlTypeByValue = "ListItem"
Case 50010
GetControlTypeByValue = "MenuBar"
Case 50009
GetControlTypeByValue = "Menu"
Case 50011
GetControlTypeByValue = "MenuItem"
Case 50033
GetControlTypeByValue = "Pane"
Case 50012
GetControlTypeByValue = "ProgressBar"
Case 50013
GetControlTypeByValue = "RadioButton"
Case 50014
GetControlTypeByValue = "ScrollBar"
Case 50039
GetControlTypeByValue = "SemanticZoom"
Case 50038
GetControlTypeByValue = "Separator"
Case 50015
GetControlTypeByValue = "Slider"
Case 50016
GetControlTypeByValue = "Spinner"
Case 50031
GetControlTypeByValue = "SplitButton"
Case 50017
GetControlTypeByValue = "StatusBar"
Case 50018
GetControlTypeByValue = "Tab"
Case 50019
GetControlTypeByValue = "TabItem"
Case 50036
GetControlTypeByValue = "Table"
Case 50020
GetControlTypeByValue = "Text"
Case 50027
GetControlTypeByValue = "Thumb"
Case 50037
GetControlTypeByValue = "TitleBar"
Case 50021
GetControlTypeByValue = "ToolBar"
Case 50022
GetControlTypeByValue = "ToolTip"
Case 50023
GetControlTypeByValue = "Tree"
Case 50024
GetControlTypeByValue = "TreeItem"
Case 50032
GetControlTypeByValue = "Window"
' ไธ่จใฎใใใใฎใฑใผในใซใไธ่ดใใชใๅ ดๅใๆช็ฅใฎใณใณใใญใผใซใฟใคใใจใใฆ็ฉบๆๅญๅใ่ฟใใพใใ
Case Else
' ๆช็ฅใฎใณใณใใญใผใซใฟใคใใฎๅ ดๅ
GetControlTypeByValue = "" ' ๆช็ฅใฎใณใณใใญใผใซใฟใคใใงใใ
End Select
' ็ตๆใใใใใฐๅบๅ
Debug.Print " ่ฆ็ด ใฎใณใณใใญใผใซใฟใคใ:" & GetControlTypeByValue ' ็ตๆใใใใใฐใฆใฃใณใใฆใซๅบๅใใพใใ
End Function
' UI่ฆ็ด ใฎใใฟใผใณใๅๅพใใใใใซๅบใฅใใฆใใใใฐใกใใปใผใธใๅบๅใใ้ขๆฐ
Function GetUIPatternAndDebug(ByVal uiElm As UIAutomationClient.IUIAutomationElement)
' uiElm: UIAutomation่ฆ็ด ใชใใธใงใฏใ
' UI่ฆ็ด ใๅฑ้๏ผๆใ็ณใฟใใใใใฎใใฟใผใณ
Dim UIExpandCollapsePattern As IUIAutomationExpandCollapsePattern
Set UIExpandCollapsePattern = uiElm.GetCurrentPattern(10005)
' UI่ฆ็ด ใ่ตทๅใใใใใฎใใฟใผใณ
Dim UIInvokePattern As IUIAutomationInvokePattern
Set UIInvokePattern = uiElm.GetCurrentPattern(10000)
' UI่ฆ็ด ใ้ธๆใใใใฟใผใณ
Dim UISelectionItemPattern As IUIAutomationSelectionItemPattern
Set UISelectionItemPattern = uiElm.GetCurrentPattern(10010)
' UI่ฆ็ด ใฎใชใณใจใชใใฎ็ถๆ
ใๅใๆฟใใใใใฎใใฟใผใณ
Dim UITogglePattern As IUIAutomationTogglePattern
Set UITogglePattern = uiElm.GetCurrentPattern(10015)
' UI่ฆ็ด ใฎๅคใ่จญๅฎ๏ผๅๅพใใใใใฎใใฟใผใณ
Dim UIValuePattern As IUIAutomationValuePattern
Set UIValuePattern = uiElm.GetCurrentPattern(10002)
' UI่ฆ็ด ใในใฏใญใผใซใใใใใฎใใฟใผใณ
Dim UIScrollPattern As IUIAutomationScrollPattern
Set UIScrollPattern = uiElm.GetCurrentPattern(10004)
' ๅใใฟใผใณใๅๅพใงใใฆใใใใ็ขบ่ชใใใใใใฐใกใใปใผใธใๅบๅ
If Not UIExpandCollapsePattern Is Nothing Then
Debug.Print " ๅฏ่ฝใชๆไฝ:ExpandCollapse"
End If
If Not UIInvokePattern Is Nothing Then
Debug.Print " ๅฏ่ฝใชๆไฝ:Invoke"
End If
If Not UISelectionItemPattern Is Nothing Then
Debug.Print " ๅฏ่ฝใชๆไฝ:SelectionItem"
End If
If Not UITogglePattern Is Nothing Then
Debug.Print " ๅฏ่ฝใชๆไฝ:Toggle"
End If
If Not UIValuePattern Is Nothing Then
Debug.Print " ๅฏ่ฝใชๆไฝ:Value"
End If
If Not UIScrollPattern Is Nothing Then
Debug.Print " ๅฏ่ฝใชๆไฝ:Scroll"
End If
End Function
' UIAutomationใไฝฟ็จใใฆใๆๅฎใใใ้จๅใฆใฃใณใใฆๅๅ
ใฎUI่ฆ็ด ใๅๅพใใใใใใฐ่กจ็คบใใใตใใใญใทใผใธใฃ
Sub CheckAllElementsWithUIAutomation()
' GetAllElements้ขๆฐใๅผใณๅบใใๆๅฎใใใ้จๅใฆใฃใณใใฆๅใจๆค็ดขใฏใผใใๆธกใ
Call GetAllElements("Challenge", "ไฝๆ")
End Sub
Comments
ใใIUIAutomationElementใใตใใผใใใฆใใPropertyIdใPatternIdใ็ขบ่ชใใใฎใงใใใฐใuiauto.PollForPotentialSupportedPropertiesใuiauto.PollForPotentialSupportedPatternsใจใใ็ดๆฅ็ใชใกใฝใใใ็จๆใใใฆใใใใใพใใ
ใใผใผใผใใใๅใใพใใฆใ
UIAใฎ้็้่ฝใฎ่จไบใใใฃใใใซๅๅผทใใใฆใใใ ใใฆใใพใใ๏ผTwitterใใใฉใญใผใใใฆใใใ ใใฆใใพใ๏ผ
ใใใ ใใๆ ๅ ฑใฏใ่ฆ็ด ใฎใในใฆใฎใใญใใใฃใใใฟใผใณใ็ขบ่ชใใ้ใซไพฟๅฉใงใใญใใๅๅผทใซใชใใพใใ๏ผ
ไปๅพใ่ฒใ ๆใใฆใใ ใใใใใใใใ้กใใใใใพใใ
Let's comment your feelings that are more than good