rictirse 發表於 2012-9-4 10:58

Windows 外掛AutoIt 的 子控

本帖最後由 rictirse 於 2012-11-5 23:48 編輯



在notepad上 掛上close BTN#include <WindowsConstants.au3>

Global $aExtrnlBtn_Ctrls, $aExtrnlBtn_OldParentPos = -1, $sExtrnlBtn_MainTitle

Global $iWinMine_PID = ProcessExists("notepad.exe")

Opt("GUIOnEventMode", 1)

If Not $iWinMine_PID Then
    $iWinMine_PID = Run("notepad.exe") ;run it
EndIf

$hWinMine_Wnd = _ProcessWaitWindow($iWinMine_PID, 1, 5)

$nSolve_Bttn = _ExternalButton_Create("Close", "Close Tasker", "_Exit", 100, 20, 290, 22, $hWinMine_Wnd)

While ProcessExists($iWinMine_PID)
      Sleep(10)
      _ExternalButton_Follow()
WEnd


Func _ProcessWaitWindow($iPID, $iVisibleOnly = 0, $iWait = 0)
    Local $hRet = -1, $iErr = 0, $iTimer = TimerInit(), $iOpt_WWD = Opt("WinWaitDelay", 1), $aWinList

    If IsString($iPID) Then
      $iPID = ProcessExists($iPID)
    EndIf

    If $iWait > 0 Then
      $iWait *= 1000
    EndIf

    While 1
      $aWinList = WinList()

      For $i = 1 To UBound($aWinList)-1
            If (($iVisibleOnly And BitAND(WinGetState($aWinList[$i]), 2)) Or Not $iVisibleOnly) And WinGetProcess($aWinList[$i]) = $iPID Then
                $hRet = $aWinList[$i] ;WinHandle
                ExitLoop 2
            EndIf
      Next

      If $iWait > 0 And TimerDiff($iTimer) >= $iWait Then
            $iErr = 1
            ExitLoop
      EndIf

      Sleep(10)
    WEnd

    Opt("WinWaitDelay", $iOpt_WWD)
    Return SetError($iErr, 0, $hRet)
EndFunc


Func _ExternalButton_Create($sBttnTxt, $sBttnTip, $sBttnFnc, $iBttnWidth, $iBttnHeight, $iFloatLeft, $iFloatTop, $hParent)
    Local $hButton_GUI, $nButton

    $hButton_GUI = GUICreate("", $iBttnWidth, $iBttnHeight, -1, -1, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
    $nButton = GUICtrlCreateButton($sBttnTxt, 0, 0, $iBttnWidth, $iBttnHeight)
    GUICtrlSetTip($nButton, $sBttnTip)

    GUICtrlSetOnEvent(-1, $sBttnFnc)
    GUISetState(@SW_SHOW, $hButton_GUI)

    $aExtrnlBtn_Ctrls += 1
    ReDim $aExtrnlBtn_Ctrls[$aExtrnlBtn_Ctrls+1]

    $aExtrnlBtn_Ctrls[$aExtrnlBtn_Ctrls] = $hParent
    $aExtrnlBtn_Ctrls[$aExtrnlBtn_Ctrls] = $hButton_GUI
    $aExtrnlBtn_Ctrls[$aExtrnlBtn_Ctrls] = $nButton
    $aExtrnlBtn_Ctrls[$aExtrnlBtn_Ctrls] = $iFloatLeft
    $aExtrnlBtn_Ctrls[$aExtrnlBtn_Ctrls] = $iFloatTop

    Return $nButton
EndFunc

Func _ExternalButton_Follow()
    Local $hParent, $hButton_GUI, $nButton, $iFloatLeft, $iFloatTop, $aParentPos, $aParentClientSize, $iBorder_Size, $iX, $iY

    For $i = 1 To $aExtrnlBtn_Ctrls
      $hParent = $aExtrnlBtn_Ctrls[$i]
      $hButton_GUI = $aExtrnlBtn_Ctrls[$i]
      $nButton = $aExtrnlBtn_Ctrls[$i]
      $iFloatLeft = $aExtrnlBtn_Ctrls[$i]
      $iFloatTop = $aExtrnlBtn_Ctrls[$i]

      If $hParent <> -1 And Not WinExists($hParent) Then
            GUISetState(@SW_HIDE, $hButton_GUI)
            $hParent = -1
      ElseIf $hParent = -1 And WinExists($sExtrnlBtn_MainTitle) Then
            GUISetState(@SW_SHOW, $hButton_GUI)
            $hParent = WinGetHandle($sExtrnlBtn_MainTitle)
      ElseIf $hParent = -1 Then
            ContinueLoop
      EndIf

      $aParentPos = WinGetPos($hParent)

      If @error Or Not IsArray($aParentPos) Then
            ContinueLoop
      EndIf

      $aParentClientSize = WinGetClientSize($hParent)

      If Not WinActive($hParent) And Not WinActive($hButton_GUI) Then
            $aParentPos = -3200
            $aParentPos = -3200
      EndIf

      If $i > 1 Or ($aExtrnlBtn_OldParentPos = -1 Or $aExtrnlBtn_OldParentPos <> $aParentPos Or $aExtrnlBtn_OldParentPos <> $aParentPos Or $aExtrnlBtn_OldParentPos <> $aParentPos) Then

            $aExtrnlBtn_OldParentPos = $aParentPos

            $iBorder_Size = ($aParentPos - $aParentClientSize) / 2

            $iX = $aParentPos + $iFloatLeft
            $iY = $aParentPos + $iBorder_Size + $iFloatTop

            WinMove($hButton_GUI, "", $iX, $iY)
      EndIf
    Next
EndFunc

Func _Exit()
      ProcessClose ("notepad.exe")
EndFunc
頁: [1]
查看完整版本: Windows 外掛AutoIt 的 子控