AutoItとUI Automation UDFを使ってポップアップウィンドウのボタンにマウスカーソルを移動させる 複数ボタン対応版
準備
![](https://memo.eightban.com/wp-content/uploads/2024/07/2024-07-07_16h56_08.png)
この機能は設定しておいてください。対応できないボタンを対応します
コード
メモ帳 ペイント One Drive クリップボード履歴 通常のウィンドウに対応します
色々なアプリに対応するのは難しいですね
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include "..\UIAIncludes\Includes\CUIAutomation2.au3"
Global Const $UIA_IsDialogPropertyId = 30174 ; Windows 10
Global $_title_1 = "btnuia"
Global $cnt = 0
Global $cnt2 = 0
;[CLASS:Windows.UI.Core.CoreWindow; INSTANCE:0]
Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
$mainwindow = GUICreate($_title_1, 70, 70)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$msg1="stopping"
$label1=GUICtrlCreateLabel($msg1, 10, 10)
$button1 = GUICtrlCreateButton("push", 10, 20,50, 50)
GUICtrlSetOnEvent($button1, "OKButton")
GUISetState(@SW_SHOW)
Global $Paused
;
HotKeySet("{Esc}", "_Exit") ; Press ESC for exit
Func _Exit()
Exit 0
EndFunc ;==>_Exit
if WinWait($_title_1, "",3) Then
sleep(50)
ControlClick ($_title_1,"","Button1")
sleep(50)
GUISetState(@SW_MINIMIZE)
EndIf
While 1
Sleep(1000) ; Idle around
if $msg1="stopping" Then
Else
_chk()
Sleep(5000)
EndIf
WEnd
Func OKButton()
; MsgBox(0, "GUI Event", "You pressed OK!")
if $msg1="stopping" Then
$msg1="executing"
Else
$msg1="stopping"
EndIf
GUICtrlSetData ($label1, $msg1)
EndFunc
Func CLOSEClicked()
; MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...")
Exit
EndFunc
;===========================
Func _chk()
; Create UI Automation object
Local $oUIAutomation = ObjCreateInterface( $sCLSID_CUIAutomation, $sIID_IUIAutomation, $dtagIUIAutomation )
If Not IsObj( $oUIAutomation ) Then Return ConsoleWrite( "$oUIAutomation ERR" & @CRLF )
ConsoleWrite( "$oUIAutomation OK" & @CRLF )
Local $pTreeWalker, $oTreeWalker
$oUIAutomation.RawViewWalker($pTreeWalker)
; $oUIAutomation.ControlViewWalker($pTreeWalker)
; $oUIAutomation.ContentViewWalker($pTreeWalker)
$oTreeWalker = ObjCreateInterface($pTreeWalker, $sIID_IUIAutomationTreeWalker, $dtagIUIAutomationTreeWalker)
If Not IsObj( $oTreeWalker ) Then Return ConsoleWrite( "$oTreeWalker ERR" & @CRLF )
ConsoleWrite( "$oTreeWalker OK" & @CRLF )
; Get Desktop element
Local $pDesktop, $oDesktop
$oUIAutomation.GetRootElement( $pDesktop )
$oDesktop = ObjCreateInterface( $pDesktop, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
If Not IsObj( $oDesktop ) Then Return ConsoleWrite( "$oDesktop ERR" & @CRLF )
ConsoleWrite( "$oDesktop OK" & @CRLF )
; --- Notepad window ---
ConsoleWrite( "--- window ---" & @CRLF )
Local $pCondition
Local $pCondition1
Local $pCondition2
Local $pCondition0
Local $pElements
#comments-start
$oUIAutomation.CreatePropertyCondition( $UIA_ControlTypePropertyId, $UIA_WindowControlTypeId, $pCondition )
If Not $pCondition Then Return ConsoleWrite( "$pCondition ERR" & @CRLF )
ConsoleWrite( "$pCondition OK" & @CRLF )
#comments-end
; --- $oUIAutomation methods ---
ConsoleWrite( "--- $oUIAutomation methods ---" & @CRLF )
Local $pCondition
$oUIAutomation.CreateTrueCondition( $pCondition )
ConsoleWrite( "$oUIAutomation.CreateTrueCondition()" & @CRLF )
; --- $oUIElement methods ---
ConsoleWrite( "--- $oUIElement methods ---" & @CRLF )
Local $pElements
$oDesktop.FindAll( $TreeScope_Children, $pCondition, $pElements )
ConsoleWrite( "$oDesktop.FindAll()" & @CRLF )
; --- Code Snippets ---
ConsoleWrite( "--- Code Snippets ---" & @CRLF )
Local $oUIElementArray1, $iLength1 ; $pElements is a pointer to an UI Automation element array
$oUIElementArray1 = ObjCreateInterFace( $pElements, $sIID_IUIAutomationElementArray, $dtagIUIAutomationElementArray )
$oUIElementArray1.Length( $iLength1 )
If Not $iLength1 Then Return ConsoleWrite( "$iLength1 = 0 ERR" & @CRLF )
ConsoleWrite( "$iLength1 = " & $iLength1 & @CRLF )
; --- Code Snippets ---
ConsoleWrite( "--- Code Snippets ---" & @CRLF )
Local $pElement1, $oElement1, $sValue1, $sValue2, $sValue3, $sValue4, $sValue5, $sValue6
For $i = 0 To $iLength1 - 1
$oUIElementArray1.GetElement( $i, $pElement1 )
$oElement1 = ObjCreateInterface( $pElement1, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
If Not IsObj( $oElement1 ) Then
ConsoleWrite( "$oElement1 ERR" & @CRLF )
ContinueLoop
EndIf
; ConsoleWrite( "$oElement1 OK" & @CRLF )
$oElement1.GetCurrentPropertyValue( $UIA_ClassNamePropertyId, $sValue1 ) ; $UIA_ClassNamePropertyId is used as example
; ConsoleWrite( "$sValue1 = " & $sValue1 & @CRLF )
#comments-start
Select
Case $sValue1 = "Notepad"
Case $sValue1 = "QQuickView"
Case $sValue1 = "ApplicationFrameWindow"
; Case $sValue1 = ""
ConsoleWrite( "$sValue1 = " & $sValue1 & @CRLF )
Case Else
ContinueLoop
EndSelect
#32770
If $sValue1 = "Shell_TrayWnd" Then ContinueLoop
If $sValue1 = "TrayNotifyWnd" Then ContinueLoop
If $sValue1 = "TextBlock" Then ContinueLoop
If $sValue1 = "Image" Then ContinueLoop
If $sValue1 = "Button" Then ContinueLoop
If $sValue1 = "ToggleButton" Then ContinueLoop
If $sValue1 = "" Then ContinueLoop
If $sValue1 = Null Then ContinueLoop
If StringInStr($sValue1, "SystemTray.") Then ContinueLoop
If StringInStr($sValue1, "Taskbar.") Then ContinueLoop
#comments-end
If $sValue1 = "Shell_TrayWnd" Then ContinueLoop
If $sValue1 = "TaskListThumbnailWnd" Then ContinueLoop
If $sValue1 = "Progman" Then ContinueLoop
ConsoleWrite( "$sValue1 = " & $sValue1 & @CRLF )
$oElement1.GetCurrentPropertyValue( $UIA_ControlTypePropertyId, $sValue5 )
$oElement1.GetCurrentPropertyValue( $UIA_WindowIsTopmostPropertyId, $sValue4 )
$oElement1.GetCurrentPropertyValue( $UIA_IsDialogPropertyId, $sValue3 )
$oElement1.GetCurrentPropertyValue( $UIA_NamePropertyId, $sValue2 )
ConsoleWrite( "$sValue2 = " & StringLeft($sValue2, 30) & @CRLF )
; If $sValue2 = "" Then ContinueLoop
; If $sValue2 = Null Then ContinueLoop
; ConsoleWrite( "$sValue3 = " & $sValue3 & @CRLF )
If $sValue2 = "Microsoft OneDrive" Then
$oUIAutomation.CreatePropertyCondition( $UIA_NamePropertyId, "了解しました", $pCondition )
If $pCondition Then
ConsoleWrite( "$pCondition OK" & @CRLF )
Local $pSave, $oSave
$oElement1.FindFirst( $TreeScope_Descendants, $pCondition, $pSave )
$oSave = ObjCreateInterface( $pSave, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
If Not IsObj( $oSave ) Then
ConsoleWrite( "$oSave ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$oSave OK" & @CRLF )
_osu($oSave)
EndIf
#comments-start
ElseIf $sValue1 = "#32770" Then
If $sValue2 = "ファイル名変更君" Then ContinueLoop
If StringInStr($sValue2, "開く") Then ContinueLoop
If StringInStr($sValue2, "保存") Then ContinueLoop
If StringInStr($sValue2, "bvhacker") Then ContinueLoop
_Btn($oTreeWalker, $oElement1 )
#comments-end
ElseIf $sValue3 = true Then
$oUIAutomation.CreatePropertyCondition( $UIA_ControlTypePropertyId, $UIA_GroupControlTypeId, $pCondition )
If $pCondition Then
ConsoleWrite( "$pCondition OK" & @CRLF )
Local $pSave, $oSave, $pGroup , $oGroup
$oElement1.FindFirst( $TreeScope_Descendants, $pCondition, $pGroup )
$oGroup = ObjCreateInterface( $pGroup, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
If Not IsObj( $oGroup ) Then
ConsoleWrite( "$oGroup ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$oGroup OK" & @CRLF )
_Btn($oTreeWalker, $oGroup )
EndIf
ElseIf $sValue1 = "OperationStatusWindow" Then
$oUIAutomation.CreatePropertyCondition( $UIA_ControlTypePropertyId, $UIA_GroupControlTypeId, $pCondition )
If $pCondition Then
ConsoleWrite( "$pCondition OK" & @CRLF )
Local $pSave, $oSave, $pGroup , $oGroup
$oElement1.FindFirst( $TreeScope_Descendants, $pCondition, $pGroup )
$oGroup = ObjCreateInterface( $pGroup, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
If Not IsObj( $oGroup ) Then
ConsoleWrite( "$oGroup ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$oGroup OK" & @CRLF )
_Btn($oTreeWalker, $oGroup )
EndIf
ElseIf $sValue1 = "XamlExplorerHostIslandWindow" Then
$oUIAutomation.CreatePropertyCondition( $UIA_ClassNamePropertyId, "ListView", $pCondition )
If $pCondition Then
ConsoleWrite( "$pCondition OK" & @CRLF )
Local $pSave, $oSave, $pGroup , $oGroup
$oElement1.FindFirst( $TreeScope_Descendants, $pCondition, $pSave )
$oSave = ObjCreateInterface( $pSave, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
If Not IsObj( $oSave ) Then
ConsoleWrite( "$oSave ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$oSave OK" & @CRLF )
_Btn($oTreeWalker, $oSave )
EndIf
ElseIf $sValue1 = "ApplicationFrameWindow" Then
If $sValue4 = true Then _osu($oElement1)
#comments-start
ElseIf $sValue5 = $UIA_WindowControlTypeId Then
$oUIAutomation.CreatePropertyCondition( $UIA_IsDialogPropertyId, true, $pCondition )
$oUIAutomation.CreatePropertyCondition( $UIA_ControlTypePropertyId, $UIA_GroupControlTypeId, $pCondition0 )
If $pCondition Then
ConsoleWrite( "$pCondition OK" & @CRLF )
If $pCondition0 Then
ConsoleWrite( "$pCondition0 OK" & @CRLF )
Local $pSave, $oSave, $pGroup , $oGroup
$oElement1.FindFirst( $TreeScope_Descendants, $pCondition, $pSave )
$oSave = ObjCreateInterface( $pSave, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
If Not IsObj( $oSave ) Then
ConsoleWrite( "$oSave ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$oSave OK" & @CRLF )
$oSave.FindFirst( $TreeScope_Descendants, $pCondition0, $pGroup )
$oGroup = ObjCreateInterface( $pGroup, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
If Not IsObj( $oGroup ) Then
ConsoleWrite( "$oGroup ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$oGroup OK" & @CRLF )
_Btn($oTreeWalker, $oGroup )
EndIf
EndIf
#comments-end
ElseIf $sValue1 = "gdkWindowToplevel" Then
; $oElement1.SetFocus()
; _osu($oElement1)
Else
; ConsoleWrite( "$pCondition ERR" & @CRLF )
; --- Save As window ---
ConsoleWrite( "--- Save As window ---" & @CRLF )
; Note that $UIA_ClassNamePropertyId maybe ia a CASE SENSITIVE condition
$oUIAutomation.CreatePropertyCondition( $UIA_ClassNamePropertyId, "Popup", $pCondition1 )
If Not $pCondition1 Then
ConsoleWrite( "$pCondition1 ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$pCondition1 OK" & @CRLF )
$oUIAutomation.CreatePropertyCondition( $UIA_WindowIsTopmostPropertyId, true, $pCondition2 )
If Not $pCondition2 Then
ConsoleWrite( "$pCondition2 ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$pCondition2 OK" & @CRLF )
; And condition
$oUIAutomation.CreateAndCondition( $pCondition1, $pCondition2, $pCondition )
If Not $pCondition Then
ConsoleWrite( "$pCondition ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$pCondition OK" & @CRLF )
$oUIAutomation.CreatePropertyCondition( $UIA_ClassNamePropertyId, "#32770", $pCondition0 )
If Not $pCondition0 Then
ConsoleWrite( "$pCondition0 ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$pCondition0 OK" & @CRLF )
Local $pSaveAsWin, $oSaveAsWin
$oElement1.FindFirst( $TreeScope_Descendants, $pCondition, $pSaveAsWin )
$oSaveAsWin = ObjCreateInterface( $pSaveAsWin, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
If Not IsObj( $oSaveAsWin ) Then
ConsoleWrite( "$oSaveAsWin ERR" & @CRLF )
$oElement1.FindFirst( $TreeScope_Descendants, $pCondition0, $pSaveAsWin )
$oSaveAsWin = ObjCreateInterface( $pSaveAsWin, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
If Not IsObj( $oSaveAsWin ) Then
ConsoleWrite( "$oSaveAsWin ERR" & @CRLF )
ContinueLoop
EndIf
EndIf
ConsoleWrite( "$oSaveAsWin OK" & @CRLF )
$oSaveAsWin.GetCurrentPropertyValue( $UIA_NamePropertyId, $sValue2 )
If StringInStr($sValue2, "開く") Then ContinueLoop
If StringInStr($sValue2, "保存") Then ContinueLoop
_Btn($oTreeWalker, $oSaveAsWin )
#comments-start
ConsoleWrite( "--- Save Button ---" & @CRLF )
$oUIAutomation.CreatePropertyCondition( $UIA_ControlTypePropertyId, $UIA_ButtonControlTypeId, $pCondition1 )
If Not $pCondition1 Then
ConsoleWrite( "$pCondition1 ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$pCondition1 OK" & @CRLF )
$oUIAutomation.CreatePropertyCondition( $UIA_ClassNamePropertyId, "Button", $pCondition2 )
If Not $pCondition2 Then
ConsoleWrite( "$pCondition2 ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$pCondition2 OK" & @CRLF )
; And condition
$oUIAutomation.CreateAndCondition( $pCondition1, $pCondition2, $pCondition )
If Not $pCondition Then
ConsoleWrite( "$pCondition ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$pCondition OK" & @CRLF )
Local $pSave, $oSave
$UIA_PaneControlTypeId
開く
$oSaveAsWin.FindFirst( $TreeScope_Descendants, $pCondition, $pSave )
$oSave = ObjCreateInterface( $pSave, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
If Not IsObj( $oSave ) Then
ConsoleWrite( "$oSave ERR" & @CRLF )
ContinueLoop
EndIf
ConsoleWrite( "$oSave OK" & @CRLF )
#comments-end
EndIf
Next
ConsoleWrite( $cnt & $cnt2 & @CRLF )
If $cnt = $cnt2 Then $cnt = 0
$cnt2 = $cnt
EndFunc
Func _osu($oSave1)
$pos1 = MouseGetPos()
; $oSave1.SetFocus()
Local $vValue, $sValue
Local $fScale = 0
; Rectangle
Local $aRect ; l, t, w, h
$oSave1.GetCurrentPropertyValue( $UIA_BoundingRectanglePropertyId, $aRect )
If Not IsArray( $aRect ) Then
ConsoleWrite( "$aRect ERR" & @CRLF )
Return
EndIf
ConsoleWrite( "$aRect OK" & @CRLF )
If $fScale > 1.00 Then
$aRect[0] = Round( $aRect[0] * $fScale )
$aRect[1] = Round( $aRect[1] * $fScale )
$aRect[2] = Round( $aRect[2] * $fScale )
$aRect[3] = Round( $aRect[3] * $fScale )
EndIf
$sValue = ""
If IsArray( $aRect ) And UBound( $aRect ) Then
$sValue = $aRect[0]
For $j = 1 To UBound( $aRect ) - 1
$sValue &= "," & $aRect[$j]
Next
EndIf
ConsoleWrite( $sValue & @CRLF )
ConsoleWrite( $pos1[0] & "," & $pos1[1] & @CRLF )
if $pos1[0]>=$aRect[0] AND $pos1[0]<=$aRect[0]+$aRect[2] Then
if $pos1[1]>=$aRect[1] AND $pos1[1]<=$aRect[1]+$aRect[3] Then Return
EndIf
If $cnt <2 Then MouseMove( $aRect[0]+$aRect[2]/2, $aRect[1]+$aRect[3]/2 )
Sleep(3000)
EndFunc
Func _Btn($oTreeWalker, $oSaveAsWin )
Local $pElement,$oElement
$oTreeWalker.GetFirstChildElement($oSaveAsWin, $pElement)
$oElement = ObjCreateInterface($pElement, $sIID_IUIAutomationElement, $dtagIUIAutomationElement)
Local $i = 0
Local $i2 = 0
While IsObj($oElement) = True
; $oElement.SetFocus()
Local $sValue1, $sValue2, $i, $sValue3, $sValue4
$oElement.GetCurrentPropertyValue($UIA_ClassNamePropertyId, $sValue1)
$oElement.GetCurrentPropertyValue($UIA_NamePropertyId, $sValue2)
$oElement.GetCurrentPropertyValue($UIA_LocalizedControlTypePropertyId, $sValue3)
$oElement.GetCurrentPropertyValue($UIA_ControlTypePropertyId, $sValue4)
ConsoleWrite("<" & $i & "> " & _
"Class=" & $sValue1 & _
" Title=" & $sValue2 & _
" T=" & $sValue3 & _
@CRLF)
Select
Case $sValue1 = "Button" or $sValue1 = "ListViewItem"
If $cnt <2 Then $oElement.SetFocus()
_osu($oElement)
$i2 += 1
If $i2 = 1 Then $cnt += 1
Case $sValue3 = "ボタン" or $sValue4 = $UIA_ButtonControlTypeId
If $cnt <2 Then $oElement.SetFocus()
_osu($oElement)
$i2 += 1
If $i2 = 1 Then $cnt += 1
EndSelect
$oTreeWalker.GetNextSiblingElement($oElement, $pElement)
$oElement = ObjCreateInterface($pElement, $sIID_IUIAutomationElement, $dtagIUIAutomationElement)
$i = $i + 1
WEnd
EndFunc
ディスカッション
コメント一覧
まだ、コメントがありません