Erkennen ob Edit,Label,...

  • Hey@all

    Habe eine Variabel $test .
    Jetzt möchte ich wissen welche Art von Control diese ist.
    Dh ist es ein Edit, Label, Input,....
    Dies brauche ich für ein Skript, den ich bald vorstellen werde.

    Thx4Help

    Nur keine Hektik - das Leben ist stressig genug

    Einmal editiert, zuletzt von Antispeed (29. Juni 2010 um 15:13)

  • Hmm. Gibst du mir pls ein Bsp. dafür. So ganz weit komme ich da nicht...

    Hier mein Anfang:

    [autoit]


    Switch _WinAPI_GetClassName($VAR)
    Case "Static"
    $class="Label"
    Case "Edit"
    $class="Edit"
    Case "Button"
    $class="Button"
    Case "ComboBox"
    $class="Combo"
    Case Else
    $class=_WinAPI_GetClassName($VAR)
    EndSwitch

    [/autoit]

    Bitte heflt, damit man Edit&Input unterscheiden kann. Wäre nett wenn einer dies hier verfollständigen würde.

    Nur keine Hektik - das Leben ist stressig genug

    Einmal editiert, zuletzt von Antispeed (28. Juni 2010 um 19:03)

  • Zitat

    [Heute, 18:46] L3viathan: Du kannst es versuchen, rauszufinden, je nachdem, welche Funktionen einen Error zurückgeben und welche nicht... wäre aber *sehr* unsauber*

    Zitat

    Dann kannst du anhand der Styles herausfinden, um welches es sich genau handelt, z.B. Input und Edit haben beide "Edit" als Klassennamen, aber Ein Edit hat ES_MULTILINE als style.

    Aber wie?

    Nur keine Hektik - das Leben ist stressig genug

  • Ja, dass ist mir klar.
    Ich möchte ja nur wissen ob das geht.

    Anderes Beispiel:
    Button und Checkbox werden beide als Button gekennzeichnet.

    Nur keine Hektik - das Leben ist stressig genug

  • Ohh, sry.
    Jetzt hast du den Edit net gesehn:

    Zitat

    Anderes Beispiel:
    Button und Checkbox werden beide als Button gekennzeichnet.

    Da kann man ja leider nicht wirklich mit Höhenerkennung arbeiten, da Button ja fast immer anders gleich hoch sind.

    Thx4Help

    Nur keine Hektik - das Leben ist stressig genug

  • Spoiler anzeigen
    [autoit]

    Func _GetWindowStyles($hwnd)
    If Not IsHWnd($hwnd) Then
    $hwnd = GUICtrlGetHandle($hwnd)
    EndIf

    $tagWINDOWINFO = DllStructCreate("DWORD cbSize; long[4]; long[4]; DWORD dwStyle; DWORD dwExStyle; DWORD dwWindowStatus;UINT;UINT;WORD;WORD")

    DllStructSetData($tagWINDOWINFO, "cbSize", DllStructGetSize($tagWINDOWINFO))

    DllCall("User32.dll", "BOOL", "GetWindowInfo", "hwnd", $hwnd, "ptr", DllStructGetPtr($tagWINDOWINFO))

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

    Return DllStructGetData($tagWINDOWINFO, "dwStyle")
    EndFunc

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

    Func _ControlGetClassName($hwnd)
    Switch _WinAPI_GetClassName($hwnd)
    Case "Static"
    $class="Label"
    Case "Edit"
    If BitAND(_GetWindowStyles($hwnd), $ES_MULTILINE) = $ES_MULTILINE Then
    $class="Edit"
    Else
    $class="Input"
    EndIf
    Case "Button"
    $class="Button"
    Case "ComboBox"
    $class="Combo"
    Case Else
    $class=_WinAPI_GetClassName($hwnd)
    EndSwitch
    Return $class
    EndFunc

    [/autoit]
  • Ergänzend dazu habe ich auch noch die Funktion '_IsCheckBox' geschrieben, um Buttons und CheckBoxen zu unterscheiden.

    Spoiler anzeigen
    [autoit]

    Func _IsCheckbox($hCtrl)
    ;funkey
    If Not IsHWnd($hCtrl) Then $hCtrl = GUICtrlGetHandle($hCtrl)
    Local $aResult = DllCall("user32.dll", "int", "GetClassNameW", "hwnd", $hCtrl, "wstr", "", "int", 4096)
    If $aResult[2] <> "Button" Then Return 0
    Local $sFuncName = "GetWindowLongW"
    If @AutoItX64 Then $sFuncName = "GetWindowLongPtrW"
    $aResult = DllCall("user32.dll", "long_ptr", $sFuncName, "hwnd", $hCtrl, "int", 0xFFFFFFF0)
    If BitAND($aResult[0], 0x3) = 0x3 Then Return 1
    Return 0
    EndFunc

    [/autoit]