Mit Snap ein Fenster auswählen

  • Ich bin neu in diesem Forum und daher weiß ich nicht nach was ich suchen hätte müssen um meine Frage zuklären
    "Mit Snap ein Fenster auswählen" hat bei google nicht das gewünschte gesucht.

    Ich möchte ein Tool schreiben das Fenster, dessen Name in einer Inputbox geschrieben ist, schließt. Damit das nen bisschen einfacher ist wollte ich mit einer Snap Funktion ein Fenster auswählen nachdem auswählen soll der Name in der Inputbox angzeigt werden und durch einen Button kann das fenster dann geschlossen werden. Zum testen hatte ich eine MsgBox eingefügt..
    Hoffe es ist verständlich Ausgedrückt.

    [autoit]

    include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

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

    $GUI1 = GUICreate("GUI1", 200, 150, 100, 200)
    $button1 = GUICtrlCreateButton('Snap Window', 60, 50, 80, 30)
    GUISetState(@SW_SHOW)

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

    $aCursor = GUICreate("", 48, 48, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
    WinSetTrans($aCursor, "", 10)
    GUISetCursor(3, 1, $aCursor)
    GUISetState(@SW_HIDE)

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

    Global $Msg
    While 1
    $Msg = GUIGetMsg()
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button1
    GUISetState(@SW_HIDE, $GUI1)
    GUISetState(@SW_SHOW, $aCursor)
    Local $pos
    Do
    $pos = MouseGetPos()
    WinMove($aCursor, "", $pos[0] - 24, $pos[1] - 24)
    Sleep(10)
    Until _IsPressed("01")
    GUISetState(@SW_HIDE, $aCursor)
    $window = WinGetTitle($pos[0], $pos[1])
    MsgBox(0, "Title", $window)
    GUISetState(@SW_SHOW, $GUI1)
    WinActivate($GUI1)

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

    EndSwitch
    WEnd

    [/autoit]

    Der $cursor teil ist von der HEX_COLOR_List hier im Forum.

    AutoIt.de :love:

    4 Mal editiert, zuletzt von Kilroy (7. Juli 2013 um 13:11)

  • Das Problem liegt in Zeile 31:

    [autoit]

    $window = WinGetTitle($pos[0], $pos[1])

    [/autoit]


    Die Funktion verlangt die Angabe von Titel und Text, du kannst also nicht einfach eine x- und y-Koordinate angeben und darauf hoffen, dass das funktioniert.
    Eine Möglichkeit, den Fenstertitel (wobei ich eher das Handle nehmen würde; siehe WinGetHandle) anhand der Fensterposition abzufragen wäre folgende, das funktioniert aber auch nur, wenn du die Position des Fensters genau angibst, und nicht einen Punkt der im Fenster liegt (d.h. du genau in die linke obere Ecke des Fensters klickst).

    [autoit]

    WinGetTitle("[X:" & $pos[0] & ";Y:" & $pos[1] & "]")

    [/autoit]

    Vielleicht hat ja jemand noch eine bessere Idee, das Window Info Tool schafft es ja auch irgendwie.

    MfG James

    Edit:
    Habe eine Funktion in der Windows API gefunden, allerdings scheint meine Umsetzung einen Fehler zu haben, da die Bereiche der Fenster nicht zu 100% stimmen. Es ist aber besser als die vorherige Lösung.

    [autoit]

    Local $pos = MouseGetPos(), $hWnd = WindowFromPoint($pos[0], $pos[1])
    MsgBox(0, $hWnd, WinGetTitle(WindowFromPoint($pos[0], $pos[1])))

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

    Func WindowFromPoint($x, $y)
    Local $POINT, $hWnd
    $POINT = BitOR(BitShift(Int($x), -32), Int($y))
    $hWnd = DllCall("user32.dll", "HWND", "WindowFromPoint", "INT64", $POINT)
    If @error Then
    Return -1
    Else
    Return $hWnd[0]
    EndIf
    EndFunc

    [/autoit]
  • erstmal danke James, ich hab nen bisschen rumprobiert aber irgendwie bekommt er nur bei einigen den Titel
    und das auch auf so komische Art, manchmal sofort und manchmal nachdem minimieren O.o

    [autoit]

    $window = WinGetHandle("[X:" & $pos[0] & ";Y:" & $pos[1] & "]")
    $s = WinGetTitle($window)
    MsgBox(0, "Title", $s)

    [/autoit]

    AutoIt.de :love:

  • Hey!
    Dafür brauchst du die "WindowFromPoint" Funktion aus der User32.dll. Zum Glück ist diese schon bereits bei AutoIt in der WinAPI.au3 mitgeliefert. Die Funktion dazu heißt: _WinAPI_WindowFromPoint()

    LG. Make :)

  • Dafür brauchst du die "WindowFromPoint" Funktion aus der User32.dll. Zum Glück ist diese schon bereits bei AutoIt in der WinAPI.au3 mitgeliefert. Die Funktion dazu heißt: _WinAPI_WindowFromPoint()

    Danke für die Info, so habe ich wenigstens auch noch was gelernt. :D

    Kilroy Dann spielt es ja auch keine Rolle, dass meine Umsetzung dieser Funktion fehlerhaft ist...
    Das Problem bei der anderen Lösung ist wahrscheinlich, dass das Fenster genau an dieser Position sein muss.

  • Kuck mal, ich hab gerade auch noch was feines gebastelt:

    Close Active Window.au3
    [autoit]


    #include <WindowsConstants.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>

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

    Global $hActiveWindowHandle
    Global $sActiveWindowTitle
    Global $hOldActiveWindowHandle
    Global $sOldActiveWindowTitle

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

    $hGUI = GUICreate("Close Active Window", 450, 68, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $DS_SETFOREGROUND), $WS_EX_TOPMOST)
    $idLabelTitle = GUICtrlCreateLabel("Title:", 5, 15)
    $idInputTitle = GUICtrlCreateInput("", 45, 11, 340, -1, $ES_READONLY)
    $idLabelHandle = GUICtrlCreateLabel("Handle:", 5, 40)
    $idInputHandle = GUICtrlCreateInput("", 45, 36, 340, -1, $ES_READONLY)
    $idButtonClose = GUICtrlCreateButton("Close" & @CRLF & "Window", 390, 9, 55, 49, $BS_MULTILINE)

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

    GUISetState(@SW_SHOW, $hGUI)

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

    While 1
    $hActiveWindowHandle = WinGetHandle("[active]")
    $sActiveWindowTitle = WinGetTitle($hActiveWindowHandle)

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

    If $hActiveWindowHandle <> $hOldActiveWindowHandle And $hActiveWindowHandle <> $hGUI And $hActiveWindowHandle <> "" Then
    $hOldActiveWindowHandle = $hActiveWindowHandle
    $sOldActiveWindowTitle = $sActiveWindowTitle
    GUICtrlSetData($idInputTitle, $sActiveWindowTitle)
    GUICtrlSetData($idInputHandle, $hActiveWindowHandle)
    EndIf

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit
    Case $idButtonClose
    ProcessClose(WinGetProcess(HWnd(GUICtrlRead($idInputHandle)))) ; oder
    ; WinKill(HWnd(GUICtrlRead($idInputHandle))) ; Oder WinClose(HWnd(GUICtrlRead($idInputHandle)))
    EndSwitch
    WEnd

    [/autoit]


    [Blockierte Grafik: http://www10.pic-upload.de/07.07.13/x6iujbwg5cuu.png]

    Damit kannst du das zuletzt aktive Fenster, bzw so wie es gerade ist den Prozess dazu schließen ;)
    Wofür ist das eigentlich genau?

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

    Einmal editiert, zuletzt von Joriktos (7. Juli 2013 um 18:07)