Fenster aktivieren aber dieses nicht in Vordergrund bringen

  • Hallo.

    Eigentlich stellt die Überschrift schon meine Frage dar:

    Ist es möglich, ein Fenster zu aktivieren bzw. zu fokussieren, ohne das es dabei in den Vordergrund kommt?

    Ich will ein Script schreiben, bei dem das Fenster unter der Maus fokussiert wird. Das Fenster aber erst in den Vordergrund kommt, wenn das Mausrad gedreht wird.

  • Also bei Visual Basic läuft das so ab:
    Form1.Visible = False
    Das heißt Form1 ist unsichtbar.
    Vielleicht kannste das ja umwandeln :D

  • @lukasboy: keine Ahnung, was du mit "umwandeln" meinst.

    Ich hab ein script von Bugfix leicht abgeändert. Nur ist bei dem das Problem, dass das Fenster erst aktiviert wird, wenn ich das Mausrad drehe. Brauche einen Befehl, der das Fenster bereits aktiviert, wenn der Mauszeiger darauf ist. Aber das Fenster soll im Hintergrund bleiben

    Und das Aktivieren passiert auch nicht sofort. Benutze Win7 x64. Kann die Verzögerung daran liegen? Kenne mich mit den Dll...-Befehlen nicht aus.

    [autoit]

    #include <MouseOnEvent.au3>

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

    While 1

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

    Local $tagPOINTAPI = DllStructCreate('long x;long y')
    DllCall('user32.dll', 'long', 'GetCursorPos', 'ptr', DllStructGetPtr($tagPOINTAPI))
    Local $xPoint = DllStructGetData($tagPOINTAPI, 'x')
    Local $yPoint = DllStructGetData($tagPOINTAPI, 'y')
    Local $hWnd_under_Mouse = WindowFromPoint($xPoint, $yPoint)

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

    If WinActive (HWnd($hWnd_under_Mouse)) Then
    _MouseSetOnEvent($MOUSE_WHEELSCROLL_EVENT)
    Else
    _MouseSetOnEvent($MOUSE_WHEELSCROLL_EVENT, "_WinAktivieren")
    EndIf
    Sleep (10)
    WEnd

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

    Func WindowFromPoint($xPoint, $yPoint)
    Local $ret = DllCall("user32", 'long', 'WindowFromPoint', 'long', $xPoint, 'long', $yPoint)
    If Not @error Then
    Return $ret[0]
    Else
    Return 0
    EndIf
    EndFunc

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

    Func _WinAktivieren()
    WinActivate (HWnd($hWnd_under_Mouse))
    EndFunc

    [/autoit]
  • [autoit]

    _MouseSetOnEvent($MOUSE_WHEELSCROLL_EVENT, "_WinAktivieren")

    [/autoit]

    Änder diese Zeile doch ab, dass es nicht mehr auf das Scrollen wartet.

  • Ich meine mit umwandeln, Visual Basic in AutoIt umwandeln. Also das :
    Form1.Visible = False
    in AutoIt umwandeln

    • Offizieller Beitrag

    Ich will ein Script schreiben, bei dem das Fenster unter der Maus fokussiert wird. Das Fenster aber erst in den Vordergrund kommt, wenn das Mausrad gedreht wird.


    Ist so nicht einfach machbar. Es können ja beliebig viele Fenster übereinander liegen. Dann mußt du schon wissen welches Fenster in Z-Order du beim Drehen des Mausrades aktivierst. Du könntest natürlich bei Z-Order 1 anfangen (oder 0?, mußt du mal schauen, wie das geregelt ist) und mit jeder Drehung eine Ebene tiefer gehen.

  • Das mit der Erkennung des Fenster funktioniert ja schon ganz gut. Jetzt möchte ich aber, dass das erkannte Fenster aktiviert wird, aber in der Position bleibt, wo es ist. Also nicht in den Vordergrund geholt wird, Sozusagen im Hintergrund aktiviert/fokussiert wird.

    • Offizieller Beitrag

    dass das erkannte Fenster aktiviert wird, aber in der Position bleibt, wo es ist. Also nicht in den Vordergrund geholt wird, Sozusagen im Hintergrund aktiviert/fokussiert wird.


    Das ist ein Widerspruch in sich. Wird ein Fenster aktiviert, dann wird es auch OnTop gesetzt. Wie sonst willst du denn auch wissen, dass das Fenster jetzt gewählt ist? Und wozu willst du es "fokussieren", wenn man es nicht sehen kann? Ich verstehe den Sinn deiner Aktion nicht.

  • Das Fenster ist schon sichtbar. Ich möchte, dass das Fenster bereits aktiviert ist, nur wenn der Mauszeiger bereits über dem Fenster ist. Aber es soll dabei im Hintergrund bleiben. Quasi das man nicht mehr erst mit der Maustaste das Fenster aktivieren muss. Wenn dann das Mausrad gedreht wird, soll bereits die Drehung des Mausrades in dem Fenster zu einer Aktion führen und das Fenster soll erst dann in den Vordergrund kommen.

  • Hallo,
    wenn du das Fenster nur durch das Rollen mit dem Mausrad in den Vordergrund holen willst wenn die Maus sich über deinem verdeckten Fenster befindet, dann müsstest du vermutlich die Mouse-Messages über einen "Hook" abfangen und dann darauf reagieren, da dein Programm ja nicht wirklich das aktive Fenster mit dem Fokus hat und somit diese Mouse-Message nicht empfängt.

    • Offizieller Beitrag

    Das Fenster ist schon sichtbar. Ich möchte, dass das Fenster bereits aktiviert ist, nur wenn der Mauszeiger bereits über dem Fenster ist. Aber es soll dabei im Hintergrund bleiben. Quasi das man nicht mehr erst mit der Maustaste das Fenster aktivieren muss.


    Du liest einfach nicht, was dir geantwortet wird!
    Ein Fenster kann nicht aktiviert und im Hintergrund sein!! Wie oft soll ich dir das noch sagen. Schreib es dir 100-mal auf den Desktop, vielleicht kapierst du es ja dann. :wacko: