On Top, durchsichtige und trotzdem durchklicken?

  • Hiho,

    ich meine mich erinnern zu können, dass ich mal folgendes prob hatte:
    ich habe ein gui erstellt, was durchsichtig und wie ein pop-up aussehen sollte, wollte es jedoch (mit editbox) auch nutzen können.
    anfänglich konnte ich aber durch das fenster durchklicken, es quasi nicht benutzen, aber es war immer da (also on top).
    das problem habe ich dann später mit einem attribut lösen können.

    nun würde ich das gerne wieder haben, jedoch nicht für ein fenster das ich programmiert habe, sondern für bereits existierende (zb das Lotus Notes immer transparent sichtbar ist,
    ich jedoch quasi durch das fenster hindurch klicken kann).

    ist sowas möglich?

  • Durchklicken ist ein bischen aufwändiger, hier eine UDF:

    Spoiler anzeigen
    [autoit]

    ;### UDF Start
    #include-once
    #include <Winapi.au3>

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

    ;===============================================================================
    ;
    ; Function Name: _Win_SetClickThrough($hWnd,$noclic = True)
    ; Description:: Makes a window to not receive mouse input
    ; Parameter(s): $title -> Title or hWnd of Window
    ; $text [Optional] -> Text in Window
    ; $noclic [Optional] -> If False, the window regains MouseInput otherwise it will loose it, defalut: True
    ; Requirement(s): <WINApi.au3>
    ; Return Value(s): Success: 1, Error0 and @error
    ; @error Values: 1 -> Window does not exist
    ; 2 -> Error in Setting the Styles
    ; Author(s): Prog@ndy
    ;
    ;===============================================================================
    ;
    Func _Win_SetClickThrough($title,$text = "",$noclic = True)
    Local $hWnd = WinGetHandle($title,$text)
    If @error Then Return SetError(1,0,0)
    If $noclic Then
    _WinAPI_SetWindowLong($hWnd,$GWL_EXSTYLE,BitOR(_WinAPI_GetWindowLong($hWnd,$GWL_EXSTYLE),$WS_EX_TRANSPARENT))
    If @error Then Return SetError(2,0,0)
    WinSetTrans($hWnd,"",255) ; Sets the Layered Attribute, but still shows the window :)
    If @error Then Return SetError(2,0,0)
    Else
    _WinAPI_SetWindowLong($hWnd,$GWL_EXSTYLE,BitAND(_WinAPI_GetWindowLong($hWnd,$GWL_EXSTYLE),BitNOT($WS_EX_TRANSPARENT)))
    If @error Then Return SetError(2,0,0)
    EndIf
    Return 1
    EndFunc
    ;### UDF END

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

    ;Example:
    $win = WinGetHandle("Unbenannt")

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

    If @error = 1 Then
    Run("notepad.exe")
    WinWait("Unbenannt")
    $win = WinGetHandle("Unbenannt")
    EndIf

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

    WinActivate($win)
    _Win_SetClickThrough($win)
    MsgBox(0, '', "Notepad receives no Mouse Clicks anymore, Click OK to Restore")
    _Win_SetClickThrough($win,"",0)

    [/autoit]
  • hast du das selber geschrieben?
    sehr sehr sehr geil, was nicht alles geht *g* das ist genau das, was ich suche =)

    big THX ;)

    PS: das bringt mich noch auf ne andere geile idee *g*
    damit kann man ja zusätzlich noch super leute ärgern *hehe*

    wie in der berufsschule. screenshot vom desktop gemacht, als hintergrundbild und alle shortcuts gelöscht ... haben sich die leute kaputt-geklickt *lol*

  • Ja, hast du nicht den Autor gesehen :P

    Zitat

    wie in der berufsschule. screenshot vom desktop gemacht, als hintergrundbild und alle shortcuts gelöscht ... haben sich die leute kaputt-geklickt *lol*


    Geht ja mit AutoIT :) ScreenShot, SetDeskTopImage, Hide Desktop bibt es ja alles :)

  • doch, teste doch mal, erweitertes Bsp:

    Spoiler anzeigen
    [autoit]

    ;Example:
    #include <String.au3>
    $win = WinGetHandle("Unbenannt")

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

    If @error = 1 Then
    Run("notepad.exe")
    WinWait("Unbenannt")
    $win = WinGetHandle("Unbenannt")
    EndIf
    WinSetOnTop($win,"",1)
    WinActivate($win)
    WinWaitActive($win)
    Send(_StringRepeat(" H E L L O H E L L O H E L L O H E L L O H E L L O H E L L O H E L L O H E L L O H E L L O H E L L O " & @CRLF,10),1)
    _Win_SetClickThrough($win)
    WinSetState($win,"",@SW_MAXIMIZE)
    WinSetTrans($win,"",150)
    MsgBox(0, '', "Notepad receives no Mouse Clicks anymore, Click OK to Restore")
    _Win_SetClickThrough($win,"",0)

    [/autoit]
  • testen:

    [autoit]

    $style = _WinAPI_GetWindowLong($hWnd,$GWL_EXSTYLE)
    If BitAND($style,$WS_EX_TRANSPARENT) = $WS_EX_TRANSPARENT And BitAND($style,$WS_EX_LAYERED) = $WS_EX_LAYERED Then
    MsgBox(0,"","Durchklick")
    EndIf

    [/autoit]