#include <MouseSetOnEvent_UDF.au3>
#include <Misc.au3>
_Singleton(@ScriptName)
HotKeySet("{ESC}","_kill")
HotKeySet("{PAUSE}","_toogle")

$aDll = DllOpen("user32.dll")
$aWin = @ScriptName
$aVal = 15
$go = True

While $go
	;Setzt den Fenster-Handle neu, falls ein neues Fenster aktiv ist.
	If $aWin <> WinGetTitle("") Then
		$aWin = WinGetTitle("")
	EndIf

	;Solange Strg gedrückt ist, werden die Events zugeordnet
	While _IsPressed(11, $aDll)
		ToolTip(WinGetTrans($aWin)) ; Zeigt die Transparenz des aktuellen Fensters
		_MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "_trans", "up", "")
		_MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "_trans", "down", "")
		If WinGetTrans($aWin) = -1 Then
			WinSetTrans($aWin,"",255)
		EndIf
		If _IsPressed(04, $aDll) Then
			ToolTip("") ;Entfernt Tool- und Traytip (sonst gibts hässliche schwarze Ränder)
			TrayTip("","",0)
			_RestoreTrans()
		EndIf
		Sleep(10)
	WEnd
	;Wenn Strg nicht gedrückt, dann hebe die zuordnungen für die Mausrad events auf.
	_MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "")
	_MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "")
	ToolTip("")
	Sleep(10)
WEnd
Func _trans($wDir)
	If _IsPressed(11, $aDll) Then
		Switch $wDir
			Case "up"
				If _IsPressed(10, $aDll) Then ; Wenn Shift gedrückt gehalten wird, ändere nur die Transparenzschritte
					$aVal += 5
					If $aVal > 255 Then $aVal = 255
					TrayTip($aVal,"Transparenzschritte",1)
				Else ; Ansonsten ändere die Transparenz selbst.
					$aTrans = WinGetTrans($aWin)
					If ($aTrans + $aVal) > 255 OR $aTrans = -1 Then
						$aTrans = 255
					Else
						$aTrans += $aVal
					EndIf
					WinSetTrans($aWin,"",$aTrans)
				EndIf
			Case "down"
				If _IsPressed(10, $aDll) Then ; Wenn Shift gedrückt gehalten wird, ändere nur die Transparenzschritte
					$aVal -= 5
					If $aVal < 0 Then $aVal = 0
					TrayTip($aVal,"Transparenzschritte",1)
				Else ; Ansonsten ändere die Transparenz selbst.
					$aTrans = WinGetTrans($aWin)
					If ($aTrans - $aVal) < 0 Then
						$aTrans = 0
					Else
						$aTrans -= $aVal
					EndIf
					WinSetTrans($aWin,"",$aTrans)
				EndIf
		EndSwitch
	EndIf
EndFunc

Func WinGetTrans($sTitle, $sText = "")
	;Author:  Valik  (Autoitscript.com)
    Local $hWnd = WinGetHandle($sTitle, $sText)
    If Not $hWnd Then Return -1
    Local $val = DllStructCreate("int")
    Local $aRet = DllCall($aDll, "int", "GetLayeredWindowAttributes", "hwnd", $hWnd, "ulong_ptr", 0, "int_ptr", DllStructGetPtr($val), "ulong_ptr", 0)
    If @error Or Not $aRet[0] Then Return -1
    Return DllStructGetData($val, 1)
EndFunc

Func _kill()
	_RestoreTrans()
	DllClose($aDll)
	Exit
EndFunc

Func _toogle()
	If $go Then
		$go = False
		TrayTip("Off - Transparency Tool v2","Press PAUSE again to start",1)
	Else
		$go = True
		TrayTip("On - Transparency Tool v2","Press PAUSE again to stop",1)
	EndIf
	While Not $go
		Sleep(100)
	WEnd
EndFunc

Func _RestoreTrans() ; Setzt die Transparenz für alle Fenster in einer For-Next schleife auf 255.
	;Hiervon ausgeschlossen sind "Program Manager" (XP) und "Start" (VISTA)
	ConsoleWrite(@CRLF&"=========================================="&@CRLF)
	$WinList = WinList()
	For $i = 1 to $WinList[0][0]
		If _IsVisible($WinList[$i][1]) Then
			If WinGetTitle($WinList[$i][1]) = "Start" Or WinGetTitle($WinList[$i][1]) = "Program Manager" Then
				Sleep(10)
			Else
				ConsoleWrite("HWND: "&$WinList[$i][1] &@CRLF&"Name: "& $WinList[$i][0]&@CRLF&@CRLF)
				WinSetTrans($WinList[$i][1],"",255)
			EndIf
		EndIf
	Next
	ConsoleWrite(@CRLF&"=========================================="&@CRLF)
EndFunc

Func _IsVisible($handle)
  If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
  Else
    Return 0
  EndIf
EndFunc
