#Region ---Include---
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ScreenCapture.au3>
#include <Misc.au3>
#include <GuiListBox.au3>
#include <Array.au3>
#EndRegion ---Include---

#Region ---Optionen---
Opt("TrayAutoPause", 0)
Opt("TrayIconDebug", 0)
Opt("TrayIconHide", 0)
Opt("TrayMenuMode", 1)
Opt("TrayOnEventMode", 0)
#EndRegion ---Optionen---

#Region ---Veriablendekleration---
Global $Nummer = 1
#EndRegion ---Veriablendekleration---

#Region ---Systray---
TraySetIcon(@SystemDir & "\shell32.dll", -142)
TraySetToolTip("Screenhot ersteller")
TraySetClick(17)

;~ MenuItems:
$TrayMenu_FotoAlles = TrayCreateItem("Screenshot erstellen")
$TrayMenu_FotoFenster = TrayCreateItem("Screenshot von einem Fenster")
TrayCreateItem("")
$TrayMenu_OrdnerOffnen = TrayCreateItem("Bilderordner öffnen")
TrayCreateItem("")
$TrayMenu_Exit = TrayCreateItem("Beenden")
#EndRegion ---Systray---

#Region ---Startup---
$Pfad = @ScriptDir & "\Bilder\" & @MDAY & "." & @MON & "." & @YEAR
If FileExists($Pfad) = 1 Then ;~ Es gibt schon Bilder von heute
	$Grossse = DirGetSize($Pfad, 1)
	If $Grossse[1] > 0 Then ;~ Wenn es eine Datei gibt
		$Frage = MsgBox(262468, "Scrennhot ersteller", "Willst du die alten Bilder löschen?")
		If $Frage = 6 Then ;~ Alte Bilder überschreiben
			DirRemove($Pfad, 1)
			DirCreate($Pfad)
		Else
;~ Nummer des letten Bildes herausfinden:
			$Durchlauf = 1
			While 1
				If FileExists($Pfad & "\BildNr." & $Durchlauf & ".jpg") = 0 Then
					$Nummer = $Durchlauf
					ExitLoop
				EndIf
				$Durchlauf += 1
			WEnd
		EndIf
	EndIf
Else
	DirCreate($Pfad)
EndIf
#EndRegion ---Startup---

#Region ---Hotkeys---
HotKeySet("{F2}", "_foto")
HotKeySet("{F3}", "_foto_von_Fenster")
HotKeySet("{F4}", "_exit")
#EndRegion ---Hotkeys---

#Region ---While---
While 1
	Switch TrayGetMsg()
		Case $TrayMenu_FotoAlles
			_foto()
		Case $TrayMenu_FotoFenster
			_foto_von_Fenster()
		Case $TrayMenu_Exit
			_exit()
		Case $TrayMenu_OrdnerOffnen
			_bilderordner_offnen()
	EndSwitch
WEnd
#EndRegion ---While---

#Region ---Funktionen---
Func _bilderordner_offnen() ;~ Ordner mit den Bildern öffnen
	Run("explorer.exe " & $Pfad)
EndFunc   ;==>_bilderordner_offnen

Func _foto_von_Fenster() ;~ Screenshot von einem Fenster erstellen
;~  Fensterauswahl-Gui erstellen:
	$FensterAuswahl = GUICreate("Screenshots-Creator - Fensterauswahl", 731, 423, -1, -1, BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_SYSMENU, $WS_CAPTION, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_POPUP, $WS_POPUPWINDOW, $WS_GROUP, $WS_TABSTOP, $WS_BORDER, $WS_CLIPSIBLINGS), BitOR($WS_EX_APPWINDOW, $WS_EX_OVERLAPPEDWINDOW, $WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
	GUISetBkColor(0xFFFF00)
	$Label1 = GUICtrlCreateLabel("Wähl ein Fenster aus, das du fotographieren willst:", 8, 8, 709, 38)
	GUICtrlSetFont(-1, 22, 800, 0, "Arial")
	GUICtrlSetColor(-1, 0xFF0000)
	$List1 = GUICtrlCreateList("", 8, 56, 713, 298, BitOR($WS_VSCROLL, $WS_BORDER), BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))
	GUICtrlSetFont(-1, 18, 400, 0, "Arial Narrow")
	GUICtrlSetColor(-1, 0xFF0000)
	GUICtrlSetBkColor(-1, 0xA6CAF0)
	$Button1 = GUICtrlCreateButton("OK", 12, 360, 375, 57, 0)
	GUICtrlSetFont(-1, 22, 800, 0, "Arial Narrow")
	$Button2 = GUICtrlCreateButton("Abrechen", 396, 360, 327, 57, 0)
	GUICtrlSetFont(-1, 22, 800, 0, "Arial Narrow")
	GUISetState(@SW_SHOW)

;~ Fensterliste erstellen:
	Local $WinList = WinList()
	Local $FensterHandls[1]
	For $Durchlauf = 1 To $WinList[0][0]
		If IniRead($Pfad, "Einstellungen", "GadgetsInBildFensterFunktion", "Nein") = "Nein" Then
			If $WinList[$Durchlauf][0] <> "" And IsVisible($WinList[$Durchlauf][1]) And $WinList[$Durchlauf][0] <> "Program manager" And $WinList[$Durchlauf][0] <> "Screenshots-Creator - Fensterauswahl" And $WinList[$Durchlauf][0] <> "Start" And ProcessExists("sidebar.exe") <> WinGetProcess($WinList[$Durchlauf][0]) Then
				_GUICtrlListBox_AddString($List1, $WinList[$Durchlauf][0])
				_ArrayAdd($FensterHandls, $WinList[$Durchlauf][1])
			EndIf
		Else
			If $WinList[$Durchlauf][0] <> "" And IsVisible($WinList[$Durchlauf][1]) And $WinList[$Durchlauf][0] <> "Program manager" And $WinList[$Durchlauf][0] <> "Screenshots-Creator - Fensterauswahl" And $WinList[$Durchlauf][0] <> "Start" Then
				_GUICtrlListBox_AddString($List1, $WinList[$Durchlauf][0])
				_ArrayAdd($FensterHandls, $WinList[$Durchlauf][1])
			EndIf
		EndIf
	Next

;~ Variablen:
	Local $FotoFenster = ""
;~ While:
	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				GUIDelete($FensterAuswahl)
				ExitLoop
			Case $Button1
				Local $FotoFenster = _GUICtrlListBox_FindString($List1, GUICtrlRead($List1), True)
				GUIDelete($FensterAuswahl)
				ExitLoop
			Case $Button2
				GUIDelete($FensterAuswahl)
				ExitLoop
		EndSwitch
	WEnd

	If $FotoFenster <> "" Then
;~ Alle anderen Fensteer verstecken:
		Local $FensterListe[1]
		$WinList = WinList()
		For $Durchlauf = 1 To $WinList[0][0]
			If $WinList[$Durchlauf][0] <> "" And IsVisible($WinList[$Durchlauf][1]) And $WinList[$Durchlauf][0] <> "Program manager" And $WinList[$Durchlauf][1] <> $FensterHandls[$FotoFenster + 1] And $WinList[$Durchlauf][0] <> "Start" And ProcessExists("sidebar.exe") <> WinGetProcess($WinList[$Durchlauf][0]) Then
				WinSetState($WinList[$Durchlauf][0], "", @SW_HIDE)
				_ArrayAdd($FensterListe, $WinList[$Durchlauf][0])
			EndIf
		Next
;~  Fenster fotographieren:
		_ScreenCapture_CaptureWnd($Pfad & "\BildNr." & $Nummer & ".jpg", $FensterHandls[$FotoFenster + 1], 0, 0, -1, -1, False) ;~  Foto machen
;~ Alle anderen Fenster einblenden
		For $b In $FensterListe
			WinSetState($b, "", @SW_SHOW)
		Next

		TrayTip("", "Foto erfolgreich erstellt.", 2, 1) ;~ Erfolgreich erstellt Info anzeigen

		$Nummer += 1 ;~ Nummer hochsetztn für das nächste Bild
	EndIf
EndFunc   ;==>_foto_von_Fenster

Func _foto() ;~ Screenshot eines Teilausschnittes erstellen
;~  Variablendeklaration:
	Dim $Foto[4]

;~ Verdunklungs-Gui erstellen
	Local $VerdunklungsGui = GUICreate("", @DesktopWidth * @DesktopWidth + 50, @DesktopHeight + 50, -15, -25, -1, 0x00000080)
	GUISetBkColor(0xFFFFFF) ;~ Farbe: Weiß
	GUISetCursor(3) ;~ + Kurser
	GUISetState(@SW_SHOW, $VerdunklungsGui)
	WinSetTrans($VerdunklungsGui, "", 50) ;~ Transparent: 50
	WinSetOnTop($VerdunklungsGui, "", 1) ;~ On top

;~ Linke obere Kante:
	TrayTip("", "Verschieb die Maus zur linken oberen Kante, und klicke.", 5, 1) ;~ Info anzeigen
	While Not _IsPressed(01) ;~ Warten bid die linke Maustaste gedrückt wird
		Sleep(50)
	WEnd

;~ Mausposition als obere linke Kante speichern
	$Maus = MouseGetPos()
	$Foto[0] = $Maus[0]
	$Foto[1] = $Maus[1]

;~ Fotobereich-Markierungs-Gui erstellen:
	Local $MarkierungsGui = GUICreate("", 1, 1, $Foto[0], $Foto[1], 0x80000000 + 0x00800000, 0x00000008)
	GUISetBkColor(0xFFC600) ;~ Farbe: Weiß
	GUISetCursor(3) ;~ + Kurser
	GUISetState(@SW_SHOW, $MarkierungsGui)
	WinSetTrans($MarkierungsGui, "", 140) ;~ Transparent: 140
	WinSetOnTop($MarkierungsGui, "", 1) ;~ On top

;~ Mauskordinaten einschränken:
	_MouseTrap($Foto[0], $Foto[1], @DesktopWidth, @DesktopHeight)

;~ Rechte untere Kante:
	TrayTip("", "Lasse die Maustaste los, wenn du an der unteren rechten Kante bist.", 5, 1) ;~ Info anzeigen

	While _IsPressed(01) ;~ Warten bid die linke Maustaste losgelassen wird
		Sleep(25)
		$Maus = MouseGetPos()
		WinMove($MarkierungsGui, "", $Foto[0], $Foto[1], $Maus[0] - $Foto[0], $Maus[1] - $Foto[1])
	WEnd

	TrayTip("", "", 0) ;~  Info ausbelden

;~ Mausposition als unteren rechten Kante speichern
	$Maus = MouseGetPos()
	$Foto[2] = $Maus[0]
	$Foto[3] = $Maus[1]

;~ Guis ausbelden
	WinSetOnTop($VerdunklungsGui, "", 0)
	GUIDelete($VerdunklungsGui)
	WinSetOnTop($MarkierungsGui, "", 0)
	GUIDelete($MarkierungsGui)

;~  Foto erstellen:
	_ScreenCapture_Capture($Pfad & "\BildNr." & $Nummer & ".jpg", $Foto[0], $Foto[1], $Foto[2], $Foto[3], False) ;~  Foto machen
;~ Mausposition entschränken
	_MouseTrap()

	TrayTip("", "Foto erfolgreich erstellt.", 2, 1) ;~ Erfolgreich erstellt Info anzeigen

	$Nummer += 1 ;~ Nummer hochsetztn für das nächste Bild
EndFunc   ;==>_foto

Func _exit() ;~ Programm beeden
	Exit
EndFunc   ;==>_exit

Func IsVisible($handle)
	If BitAND(WinGetState($handle), 2) Then
		Return 1
	Else
		Return 0
	EndIf
EndFunc   ;==>IsVisible
#EndRegion ---Funktionen---
