#include #include #include #include #include #include #include #include #include "_IsPressedToString.au3" #RequireAdmin Global $install = "" Global $actualHwnd = -1 Global $actualAdvancedSelector = -1 Global $actualSend = "" Global $pressed[0] initInstall() HotKeySet("{F1}", valider) HotKeySet("{F2}", quit) While 1 checkClic() checkSend() Sleep(10) WEnd Func valider() addWinWait() $install &= "EndFunc" & @CRLF & @CRLF & _ "Func winWaitVisible($hwnd, $ctrlId = Null)" & @CRLF & _ " Local $hwndCheck" & @CRLF & _ " While 1" & @CRLF & _ " $hwndCheck = $ctrlId == Null ? $hwnd : ControlGetHandle($hwnd, '', $ctrlId)" & @CRLF & _ " If(BitAND(WinGetState($hwnd), $WIN_STATE_VISIBLE) == $WIN_STATE_VISIBLE) Then ExitLoop" & @CRLF & _ " Sleep(10)" & @CRLF & _ " WEnd" & @CRLF & _ " Return WinGetHandle($hwnd)" & @CRLF & _ "EndFunc" & @CRLF save() initInstall() EndFunc Func save() Local $path = FileSaveDialog("Nom du script", @ScriptDir, "AutoIt (*.au3)", $FD_PROMPTOVERWRITE, "install.au3") If(StringLen($path) > 0) Then Local $file = FileOpen($path, 2) FileWrite($file, $install) FileClose($file) Else ClipPut($install) EndIf EndFunc Func initInstall() $install = "#include " & @CRLF & _ "#RequireAdmin" & @CRLF & @CRLF & _ "install()" & @CRLF & @CRLF & _ "Func install()" & @CRLF & _ " Local $hwnd" & @CRLF & _ " Local $selector" & @CRLF & @CRLF EndFunc Func checkSend() Local $index = -1 For $i = 0 To 255 $hex = Hex($i, 2) $index = _ArrayFindAll($pressed, $hex) If(_IsPressed($hex)) Then If(UBound($index, 1) <= 0) Then _ArrayAdd($pressed, $hex) Local $str = IsPressedToString(StringRight($hex, 2)) If(StringLen($str) > 0) Then addWinWait() $actualSend &= $str EndIf EndIf Else If(UBound($index, 1) > 0) Then _ArrayDelete($pressed, $index[0]) EndIf EndIf Next EndFunc Func checkClic() If(_IsPressed("01")) Then Local $hwnd = getHwndUnderMouse() Local $advancedSelector = _GetAdvancedSelector($hwnd) If(Not($advancedSelector == 0)) Then $advancedSelector = '"' & $advancedSelector & '"' EndIf Local $mpos = getMouseRelativePos($hwnd) Do Sleep(10) Until(Not(_IsPressed("01"))) addWinWait($advancedSelector, Null, True) $install &= ' ControlClick($hwnd, "", $selector, "left", 1, ' & $mpos[0] & ', ' & $mpos[1] & ')' & @CRLF EndIf EndFunc Func addWinWait($selector = Null, $hwnd = Null, $forceSend = False) $hwnd = $hwnd == Null ? WinGetHandle("[ACTIVE]") : $hwnd $selector = $selector == Null ? $actualAdvancedSelector : $selector If($forceSend) Then addSend() EndIf If($hwnd <> $actualHwnd Or Not($selector == $actualAdvancedSelector)) Then If(Not($forceSend)) Then addSend() EndIf If($hwnd <> $actualHwnd) Then $install &= ' $hwnd = winWaitVisible("' & WinGetTitle($hwnd) & '")' & @CRLF $install &= ' Sleep(250)' & @CRLF EndIf If($hwnd <> $actualHwnd Or Not($selector == $actualAdvancedSelector)) Then $install &= ' $selector = ' & $selector & @CRLF $install &= ' winWaitVisible($hwnd, $selector)' & @CRLF EndIf $actualHwnd = $hwnd $actualAdvancedSelector = $selector $actualSend = "" EndIf EndFunc Func addSend() If(StringLen($actualSend) > 0) Then $install &= ' ControlSend($hwnd, "", $selector, "' & $actualSend & '")' & @CRLF EndIf EndFunc Func getMouseRelativePos($hwnd) Local $mpos = MouseGetPos() Local $pos = WinGetPos($hwnd) $pos[0] = $mpos[0] - $pos[0] $pos[1] = $mpos[1] - $pos[1] Return $pos EndFunc Func getHwndUnderMouse() Local $tPoint = _WinAPI_GetMousePos() Return _WinAPI_WindowFromPoint($tPoint) EndFunc Func WinGetClientPos($hwnd) Local $Side = WinGetSideSize($hwnd) Local $wPos = WinGetPos($hwnd) Local $clientPos[4] = [$wPos[0]+$Side[0], $wPos[1]+$Side[1], $wPos[2]-$Side[0]*2, $wPos[3]-$Side[0]-$Side[1]] Return $clientPos EndFunc Func WinGetSideSize($hwnd) Local $size = [0, 0] Local $clientSize = WinGetClientSize($hwnd) If(IsArray($clientSize)) Then Local $winSize = WinGetPos($hwnd) If(IsArray($winSize)) Then $size[0] = Round(($winSize[2]-$clientSize[0])/2) $size[1] = $winSize[3]-$clientSize[1]-$size[0] EndIf EndIf Return $size EndFunc Func _GetAdvancedSelector($hwnd) Local $list, $text, $id = 0 $text = _WinAPI_GetClassName($hwnd) If Not $text Then Return 0 EndIf $list = _WinAPI_EnumChildWindows(_WinAPI_GetAncestor($hwnd, $GA_ROOT), 0) If @error Then Return 0 EndIf For $i = 1 To $list[0][0] If $list[$i][1] = $text Then $id += 1 EndIf If $list[$i][0] = $hwnd Then ExitLoop EndIf Next If Not $id Then Return 0 EndIf Return "[CLASS:" & $text & "; INSTANCE:" & $id & "]" EndFunc Func quit() Exit EndFunc