WM_SETFOCUS / WM_KILLFOCUS geht nicht mit Tabs?

  • Wenn man bei diesem Script die Zeile 4 aktiviert, dann funktionieren WM_SETFOCUS u WM_KILLFOCUS nicht mehr!

    [autoit]

    #include <WindowsConstants.au3>

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

    $hGui = GUICreate("", 400, 300)
    ;$hTab = GUICtrlCreateTab(0, 0, 400, 300)
    GUISetState()

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

    GUIRegisterMsg($WM_KILLFOCUS, "WM_KILLFOCUS")
    GUIRegisterMsg($WM_SETFOCUS, "WM_SETFOCUS")

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

    While GUIGetMsg() <> -3
    Sleep(10)
    WEnd

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

    Func WM_KILLFOCUS($hWnd, $Msg, $wParam, $lParam)
    ConsoleWrite("!KILLFOCUS " & $hGui & " " & $hWnd & " " & $wParam & @CRLF)
    EndFunc ;==>WM_KILLFOCUS

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

    Func WM_SETFOCUS($hWnd, $Msg, $wParam, $lParam)
    ConsoleWrite("+SETFOCUS " & $hGui & " " & $hWnd & " " & $wParam & @CRLF)
    EndFunc ;==>WM_SETFOCUS

    [/autoit]

    Hat jemand eine Idee oder Lösung für dieses Problem?

    Danke
    E

    • Offizieller Beitrag

    Das hat nicht direkt mit dem Tab zu tun. Das passiert dir mit jedem GUI-Ctrl das du auf das Fenster setzt.
    Meine Erklärung, die ich mir aus dem Verhalten erstellt habe:
    Wenn du das Fenster mit gesetztem Ctrl minimierst passiert nix - aber beim Wiederherstellen wird erst der Fokus gesetzt und bekommt dann sofort die Kill-Message. Vermutlich, weil dann das Ctrl den Fokus hat.
    Da du aber den Fokus des Fensters abfragst bekommst du dort keine Änderungen mehr - es hat ihn ja abgegeben.

    Edit:
    Übrigens gibt $wParam immer das 'entgegengesetzte' Handle zurück:
    - KILLFOCUS, wParam = Fenster, das den Fokus erhalten hat
    - SETFOCUS, wParam = Fenster, das den Fokus verloren hat

    Aber so richtig verständlich ist es nicht. Minimiere mal und hol zurück. Seltsamerweise bekommt das Tab (oder das entsprechende Ctrl) den Fokus, verliert ihn aber nicht, zumindest läuft keine Msg dazu auf.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>

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

    $hGui = GUICreate("", 400, 300)
    $hTab = GUICtrlCreateTab(0, 0, 400, 300)
    GUISetState()

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

    ConsoleWrite('hWnd TAB: ' & GUICtrlGetHandle($hTab) & @CRLF)
    ConsoleWrite('hWnd GUI: ' & $hGui & @CRLF)

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

    GUIRegisterMsg($WM_KILLFOCUS, "WM_KILLFOCUS")
    GUIRegisterMsg($WM_SETFOCUS, "WM_SETFOCUS")

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

    While GUIGetMsg() <> -3
    Sleep(10)
    WEnd

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

    Func WM_KILLFOCUS($hWnd, $Msg, $wParam, $lParam)
    ConsoleWrite('Fokus erhalten: ' & $wParam & @CRLF)
    ConsoleWrite("!KILLFOCUS " & $hGui & " " & $hWnd & " " & $wParam & @CRLF)
    EndFunc ;==>WM_KILLFOCUS

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

    Func WM_SETFOCUS($hWnd, $Msg, $wParam, $lParam)
    ConsoleWrite('Fokus verloren: ' & $wParam & @CRLF)
    ConsoleWrite("+SETFOCUS " & $hGui & " " & $hWnd & " " & $wParam & @CRLF)
    EndFunc ;==>WM_SETFOCUS

    [/autoit]
  • Meinst Du so etwas?

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $hGui = GUICreate("", 400, 300)
    $hTab = GUICtrlCreateLabel("", 10, 10, 380, 280)
    GUISetState()

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

    GUIRegisterMsg($WM_KILLFOCUS, "WM_KILLFOCUS")
    GUIRegisterMsg($WM_SETFOCUS, "WM_SETFOCUS")
    GUIRegisterMsg($WM_ACTIVATEAPP, "WM_ACTIVATEAPP")

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

    While GUIGetMsg() <> -3
    Sleep(10)
    WEnd

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

    Func WM_KILLFOCUS($hWnd, $Msg, $wParam, $lParam)
    ConsoleWrite("!KILLFOCUS " & $hGui & " " & $hWnd & " " & $wParam & @CRLF)
    EndFunc ;==>WM_KILLFOCUS

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

    Func WM_SETFOCUS($hWnd, $Msg, $wParam, $lParam)
    ConsoleWrite("+SETFOCUS " & $hGui & " " & $hWnd & " " & $wParam & @CRLF)
    EndFunc ;==>WM_SETFOCUS

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

    Func WM_ACTIVATEAPP($hWnd, $Msg, $wParam, $lParam)
    If $wParam Then
    ConsoleWrite("+Activated " & $hGui & " " & $hWnd & " " & $wParam & @CRLF)
    Else
    ConsoleWrite("-Deactivated " & $hGui & " " & $hWnd & " " & $wParam & @CRLF)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]
  • Ja! Dankeschön!