Einzelinfo aus Funktionen mit Array-Rückgabe

    • Offizieller Beitrag

    Hi,
    ihr kennt es sicher: Man benötigt in einem Funktionsaufruf den X-Wert des Cursors od. die ID über der der Cursor ist, einen Wert der Position eines Fensters oder eines Controls.
    In jedem Fall habe ich keinen direkten Zugriff sondern muss mir mit dem Funktionsaufruf ein Array zurückgeben lassen und kann anschließend auf die einzelnen Werte zugreifen.
    Solange ich mehrere Werte verwende ist das OK, aber bei einem einzelnen ist es eleganter, wenn ich den Funktionsaufruf zur Abfrage des Parameters direkt in meine Zielfunktion einsetzen kann.

    Ich habe folgende Funktionen etwas umgebaut:
    • WinGetPos ==> _WinGetPos
    • ControlGetPos ==> _CtrlGetPos
    • GUIGetCursorInfo ==> _GUICursorInfo

    und zusätzlich noch eine Funktion zur Statusabfrage:
    • _WinHasState

    Ausserdem können alle Einzelparameter neben dem bekannten Index im Array auch über ihren Parameternamen abgefragt werden (s. Funktionsbeschreibungen), das erleichtert durchaus das Lesen des Codes und erspart Kommentare:

    [autoit]


    $FensterBreite = _WinGetPos('w') ;== od. _WinGetPos(2)
    $Ctrl_Hoehe = _CtrlGetPos('h', $hWnd, $ID) ;== od. _CtrlGetPos(3, $hWnd, $ID)
    $ID_unter_Cursor = _GUICursorInfo('id') ;== od. _GUICursorInfo(4)
    $Existiert = _WinHasState('exists', 'Firefox') ;== od. _WinHasState(1, 'Firefox')

    [/autoit]


    Alles zusammen habe ich in der Datei "GuiPartialInfo.au3" gespeichert.

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name....: _WinGetPos
    ; Description......: wie WinGetPos() - aber Einzelparameterabfrage möglich
    ; Parameter(s).....: $_vPart -1 (Standard) gibt das kpl. Array zurück, sonst Index im Array od. Parameter [ x,y,w,h ]
    ; .................: $_hWnd Handle des Fensters oder Titel, Standard "" - das aktive Fenster
    ; ...optional......: $_sText optionaler Text zur Fenster-Bestimmung
    ; Return Value(s)..: Erfolg Array mit Positionsdaten oder einzelner Positionswert
    ; .................: Fehler @error 1 - Fenster konnte nicht bestimmt werden
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _WinGetPos($_vPart=-1, $_hWnd='', $_sText='')
    Local $aHWnd = WinGetPos($_hWnd, $_sText)
    If @error Then Return SetError(1,0,0)
    Switch String($_vPart)
    Case '-1'
    Return $aHWnd
    Case '0', 'x'
    Return $aHWnd[0]
    Case '1', 'y'
    Return $aHWnd[1]
    Case '2', 'w'
    Return $aHWnd[2]
    Case '3', 'h'
    Return $aHWnd[3]
    EndSwitch
    EndFunc ;==>_WinGetPos

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name....: _CtrlGetPos
    ; Description......: wie ControlGetPos - aber Einzelparameterabfrage möglich
    ; Parameter(s).....: $_vPart -1 (Standard) gibt das kpl. Array zurück, sonst Index im Array od. Parameter [ x,y,w,h ]
    ; .................: $_hWnd Handle des Fensters oder Titel
    ; .................: $_ID ID des Controls
    ; ...optional......: $_sText optionaler Text zur Fenster-Bestimmung
    ; Return Value(s)..: Erfolg Array mit Positionsdaten oder einzelner Positionswert
    ; .................: Fehler @error 1 - Control konnte nicht bestimmt werden
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _CtrlGetPos($_vPart, $_hWnd, $_ID, $_sText='')
    Local $aCtrl = ControlGetPos($_hWnd, $_sText, $_ID)
    If @error Then Return SetError(1,0,0)
    Switch String($_vPart)
    Case '-1'
    Return $aCtrl
    Case '0', 'x'
    Return $aCtrl[0]
    Case '1', 'y'
    Return $aCtrl[1]
    Case '2', 'w'
    Return $aCtrl[2]
    Case '3', 'h'
    Return $aCtrl[3]
    EndSwitch
    EndFunc ;==>_CtrlGetPos

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name....: _GUICursorInfo
    ; Description......: wie GUIGetCursorInfo - aber Einzelparameterabfrage möglich
    ; Parameter(s).....: $_vPart -1 (Standard) gibt das kpl. Array zurück, sonst Index im Array od. Parameter [ x,y,primary,secondary,id ]
    ; .................: $_hWnd Handle des Fensters oder Titel
    ; Return Value(s)..: Erfolg Array mit Cursordaten oder einzelner Wert
    ; .................: Fehler @error 1 - Aufruf GUIGetCursorInfo() fehlerhaft
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICursorInfo($_vPart=-1, $_hWnd='')
    Local $aCursor = GUIGetCursorInfo($_hWnd)
    If @error Then Return SetError(1,0,0)
    Switch String($_vPart)
    Case '-1'
    Return $aCursor
    Case '0', 'x'
    Return $aCursor[0]
    Case '1', 'y'
    Return $aCursor[1]
    Case '2', 'primary'
    Return $aCursor[2]
    Case '3', 'secondary'
    Return $aCursor[3]
    Case '4', 'id'
    Return $aCursor[4]
    EndSwitch
    EndFunc ;==>_GUICursorInfo

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name....: _WinHasState
    ; Description......: Überprüft ob ein Fenster einen bestimmten Status hat
    ; Parameter(s).....: $_vState Der zu prüfende Status als numerischer Wert od. Parameter [ exists,visible,enabled,active,minimized,maximized ]
    ; .................: $_hWnd Handle des Fensters oder Titel, Standard "" - das aktive Fenster
    ; ...optional......: $_sText optionaler Text zur Fenster-Bestimmung
    ; Return Value(s)..: Erfolg True / False
    ; .................: Fehler @error 1 - Fenster konnte nicht bestimmt werden
    ; .................: @error 2 - übergebenes Statuswort gibt es nicht
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _WinHasState($_vState, $_hWnd='', $_sText='')
    If IsString($_vState) Then
    Switch $_vState
    Case 'exists'
    $_vState = 1
    Case 'visible'
    $_vState = 2
    Case 'enabled'
    $_vState = 4
    Case 'active'
    $_vState = 8
    Case 'minimized'
    $_vState = 16
    Case 'maximized'
    $_vState = 32
    EndSwitch
    If IsString($_vState) Then Return SetError(2,0,0)
    EndIf
    If IsString($_hWnd) Then $_hWnd = WinGetHandle($_hWnd)
    Local $iState = WinGetState($_hWnd, $_sText)
    If @error Then Return SetError(1,0,0)
    Return Not Not BitAND($iState, $_vState)
    EndFunc ;==>_WinHasState

    [/autoit]
  • Nette kleine UDF :D

    Aber unbedingt brauchbar ist diese (zmd. für mich) wohl nicht. Da finde ich es persönlich einfacherer das zurück gegebene Array zu verwenden.


    Nun ja, leider kann ich dir jetzt auch keine verbesserungsvorschläge geben, weil es da an sich nichts mehr zu verbessern gibt.
    Na dann :D Es wird sich sicher der eine oder andere finden der sie benötigt ^^