1. Tải bản cài đặt AutoIT mới nhất

    Chào Khách. Nếu bạn mới tham gia và chưa cài đặt AutoIT.
    Vui lòng vào topic trên để tải bản AutoIT mới nhất nhé
    Dismiss Notice
  2. Quy định và nội quy

    Chào Khách. Vui lòng đọc kỹ nội quy và quy định của diễn đàn
    Để tránh bị ban một cách đáng tiếc nhé!
    Dismiss Notice
  3. Hướng dẫn chèn mã AutoIT trong diễn đàn

    Chào Khách. Vui lòng xem qua bài viết này
    Để biết cách chèn mã AutoIT trong diễn đàn bạn nhé :)
    Dismiss Notice

Source Window Finder - Ví dụ GUI về nút tìm cửa sổ như Window Info

Thảo luận trong 'Chia sẻ mã nguồn' bắt đầu bởi Tungtata, 12/1/22 lúc 16:40.

  1. Tungtata

    Tungtata Tà tà mà sống ~ Thành viên BQT Administrator
    • 93/113

    Tham gia ngày:
    25/8/15
    Bài viết:
    283
    Đã được thích:
    898
    Nơi ở:
    Hà Nội
    Code ví dụ về nút tìm cửa sổ như Autoit Window Info
    Khi nhấn sẽ đổi cursor thành nút finder và trả về thông tin cửa sổ sau khi nhả chuột

    [​IMG]

    Source dưới đây còn kèm .cur và bmp thì tải đính kém nhé

    Mã (AutoIt):
    #include <Misc.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPIRes.au3>
    Global $x, $MyWin, $MyCoords

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 322, 138, -1, -1)

    $Button1 = GUICtrlCreateButton("", 128, 16, 75, 30, $BS_BITMAP)
    GUICtrlSetImage($Button1, @ScriptDir & "\target.bmp")
    $hLabel = GUICtrlCreateEdit("", 0, 50, 322, 80)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit

            Case $GUI_EVENT_PRIMARYDOWN
                $iBegin = TimerInit()
                $aCInfo = GUIGetCursorInfo($Form1)
                If $aCInfo[4] = $Button1 Then
                    ConsoleWrite("mouse down")
    ;~                 GUICtrlSetData($hLabel, "Mouse down")
                    Local $Backup = _WinAPI_CopyCursor(_WinAPI_LoadCursor(0, 32512))
                    Local $LoadCur = _WinAPI_LoadCursorFromFile(@ScriptDir & '\cursor.cur')
                    Local $setCur = _WinAPI_SetSystemCursor($LoadCur, 32512)
                    GUICtrlSetImage($Button1, @ScriptDir & "\none.bmp")

                    While 1
                        If GUIGetMsg() = $GUI_EVENT_PRIMARYUP Then
                            $getWin = _GetWin()

                            _WinAPI_SetSystemCursor($Backup, 32512)
                            _WinAPI_DestroyCursor($LoadCur)
                            GUICtrlSetImage($Button1, @ScriptDir & "\target.bmp")
                            ConsoleWrite("mouse up")
                            GUICtrlSetData($hLabel, $getWin)
                            ExitLoop
                        EndIf
                        Sleep(10)
                    WEnd
                EndIf
        EndSwitch
    WEnd


    Func _GetWin()
        Local $Coords
        ToolTip("")
        $Mouse = MouseGetPos()
        $OldMouse = $Mouse
        $Windows = _WinList()
        ;_ArrayDisplay($Windows, "")
        For $x = 1 To UBound($Windows) - 1
            $Coords = WinGetPos($Windows[$x][0], "")
            If $Coords = -4 Then ExitLoop
            If IsArray($Coords) Then
                If $Mouse[0] >= $Coords[0] And $Mouse[0] <= ($Coords[0] + $Coords[2]) And $Mouse[1] >= $Coords[1] And $Mouse[1] <= ($Coords[1] + $Coords[3]) Then ExitLoop
            EndIf
        Next
        If $x = UBound($Windows) Then $x -= 1
        $MyWin = $Windows[$x][0]
        $Control = _MouseGetCtrlInfo()
        $Return = $Windows[$x][0] & @CRLF & $Control
        Return $Return
    EndFunc   ;==>_GetWin

    Func _WinList()
        Local $WinListArray[1][2]
        $var = WinList()
        For $i = 1 To $var[0][0]
            If $var[$i][0] <> "" And IsVisible($var[$i][1]) Then
                ReDim $WinListArray[UBound($WinListArray) + 1][2]
                $WinListArray[UBound($WinListArray) - 1][0] = $var[$i][0]
                $WinListArray[UBound($WinListArray) - 1][1] = $var[$i][1]
            EndIf
        Next
        Return $WinListArray
    EndFunc   ;==>_WinList

    Func IsVisible($handle)
        If BitAND(WinGetState($handle), 2) Then
            Return 1
        Else
            Return 0
        EndIf
    EndFunc   ;==>IsVisible

    Func _MouseGetCtrlInfo() ; get ID, Classe and Text of a control
        Global $hWin = WinGetHandle($MyWin)
        Global $sClassList = WinGetClassList($hWin)
        Local $sSplitClass = StringSplit(StringTrimRight($sClassList, 1), @LF)
        Local $aMPos = MouseGetPos()
        ;_ArrayDisplay($sSplitClass, "")
        $MyCoords = ClientToScreen($hWin)
        For $iCount = UBound($sSplitClass) - 1 To 1 Step -1
            Local $nCount = 0
            If $sSplitClass[$iCount] = "WorkerW" Then ContinueLoop
            While 1
                $nCount += 1
                $aCPos = ControlGetPos($hWin, '', $sSplitClass[$iCount] & $nCount)
                If @error Then ExitLoop
                $hCtrlWnd = ControlGetHandle($hWin, "", $sSplitClass[$iCount] & $nCount)
                If IsArray($aCPos) Then
                    If $aMPos[0] >= ($MyCoords[0] + $aCPos[0]) And $aMPos[0] <= ($MyCoords[0] + $aCPos[0] + $aCPos[2]) _
                            And $aMPos[1] >= ($MyCoords[1] + $aCPos[1]) And $aMPos[1] <= ($MyCoords[1] + $aCPos[1] + $aCPos[3]) Then
                        $aReturn = DllCall('User32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $hCtrlWnd)
                        If @error Then Return "Err"
                        $Text = ControlGetText($hWin, '', $sSplitClass[$iCount] & $nCount)
                        If StringInStr($Text, @LF) Then $Text = "demasiado largo"
                        If IsArray($aReturn) Then Return 'ControlID: ' & $aReturn[0] & @CRLF & 'ClassNameNN: ' & $sSplitClass[$iCount] & $nCount & @CRLF & "Text: " & $Text
                    EndIf
                EndIf
            WEnd
        Next
        ;_ArrayDisplay($sSplitClass, "")
        Return "No Ctrl"
    EndFunc   ;==>_MouseGetCtrlInfo

    Func ClientToScreen($hWnd) ; get client area of a win relative to the screan
        Local $Point, $aRes[2]
        Local $cX, $cY
        $Point = DllStructCreate("int;int")
        DllStructSetData($Point, 1, $cX)
        DllStructSetData($Point, 1, $cY)
        DllCall("User32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($Point))
        $aRes[0] = DllStructGetData($Point, 1)
        $aRes[1] = DllStructGetData($Point, 2)
        Return $aRes
    EndFunc   ;==>ClientToScreen

     
     

    Các file đính kèm:

Chia sẻ trang này

Đang tải...