#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=FG2.ico
#AutoIt3Wrapper_outfile=screencap.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <Array.au3>
#include <Misc.au3>


Opt("TrayMenuMode", 2)
Opt("TrayAutoPause", 0)
Opt("GUIOnEventMode", 1) ;Wechsle in den OnEvent Modus
Opt("MouseCoordMode", 2)

Global $gui, $msg, $MCpos, $SCpos, $SCpos0, $SCpos1, $weite, $hoehe, $fehler, $Name1, $Name2, $mousepos
Global $counter = 0, $ausg_quali = 4, $border1, $border2, $paaddedborder, $y = 0, $settingsitem, $displayitem, $MCstatus, $fullscreen = 0, $drag = 0
Global $hdll_gdi32 = DllOpen("gdi32.dll")
Global $userdll = DllOpen("user32.dll")
Global $sFile = "auflösung.ini"


If Not FileExists($sFile) Then
	eingabe()
Else
	lesen()
EndIf

Func eingabe()
	$weite = InputBox("auflösung", "breite des side-display")
	$hoehe = InputBox("auflösung", "höhe des side-display")
	$ausg_quali = InputBox("Bildqualität", "Es sind Werte zwischen 1 und 4 möglich." & @CRLF & "Je höher desto besser ist das Bild, aber auch die Systemauslastung")
	$Name1 = InputBox("Dein Name", "Besitzer")
	$Name2 = InputBox("Mein Name", "System")
	iniwrite_eingabe()
EndFunc   ;==>eingabe

Func lesen()
	iniread_lesen()


	If $weite < 10 Then
		$weite = InputBox("resolution", "with of sideport display")
		IniWrite($sFile, "widht", "widht", $weite)
	EndIf
	If $hoehe < 10 Then
		$hoehe = InputBox("resolution", "height of sideport display")
		IniWrite($sFile, "height", "height", $hoehe)
	EndIf
	If $ausg_quali < 1 Then
		$ausg_quali = InputBox("Quality", "you can coose from 1 to 4" & @CRLF & "higher looks better")
		IniWrite($sFile, "Qualität", "level", $ausg_quali)
	EndIf
EndFunc   ;==>lesen

WinWait("Windows Media Center", '', 5); warte auf das media center

#Region --- CodeWizard generated code Start ---

;MsgBox features: Title=Yes, Text=Yes, Buttons=Yes and No, Icon=Critical, Timeout=10 ss
If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
$iMsgBoxAnswer = MsgBox(20, "ERROR", "MC isn`t running or not visible" & @CRLF & "Start MC?", 10)
Select
	Case $iMsgBoxAnswer = 6 ;Yes
		Run(@WindowsDir & "\ehome\ehshell.exe", @WindowsDir & "\ehome")
		WinWaitActive("Windows Media Center", '', 5); warte auf das media center
	Case $iMsgBoxAnswer = 7 ;No
		$fehler = "Media Center Fenster nicht gefunden, abbruch durch User"
		CLOSE_error_abfrage()
	Case $iMsgBoxAnswer = -1 ;Timeout
		$fehler = "Media Center Fenster nicht gefunden, abbruch durch Timeout"
		CLOSE_error_abfrage()
EndSelect
#EndRegion --- CodeWizard generated code Start ---




;==> Windows Metrics lesen
$border1 = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics", "CaptionHeight") ; titelleiste lesen
$border1 = $border1 / 15
$border2 = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics", "PaddedBorderWidth") ; Ramenfüllung lesen
$border2 = $border2 / 15
$border3 = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics", "BorderWidth") ; Ramen lesen
$border3 = $border2 / 15
$paaddedborder1 = $border1 + $border2 + $border3
;~ MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$paaddedborder1' & @lf & @lf & 'Return:' & @lf & $paaddedborder1) ;### Debug MSGBOX
$paaddedborder2 = $border2 + $border3
;~ MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$paaddedborder2' & @lf & @lf & 'Return:' & @lf & $paaddedborder2) ;### Debug MSGBOX
$paaddedborder3 = $border1 + $border3
;~ MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$paaddedborder3' & @lf & @lf & 'Return:' & @lf & $paaddedborder3) ;### Debug MSGBOX
;==> Windows Metrics lesen ende



$hDesktop = _WinAPI_GetDesktopWindow() ;Handle des Desktops hohlem
$hDC_Desktop = _WinAPI_GetDC($hDesktop) ;Den Device Context vom Desktop ermitteln

;==>gui erstellen
$hGUI = GUICreate("Desktop", $weite, $hoehe, $SCpos0, $SCpos1,$WS_SIZEBOX + $WS_POPUP) ;Eine gui erstellen
$hDC_GUI = _WinAPI_GetDC($hGUI) ;den  DC davon ermitteln
If $drag == 1 Then
	GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
EndIf
GUISetBkColor(0x000000)


GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
;==>gui erstellen Ende

;==> Trayicon Erweitern
$settingsitem = TrayCreateItem("Settings")
$displayitem = TrayCreateItem("Fullscreen")
$nodrag = TrayCreateItem("No Drag")
TrayCreateItem("")
$aboutitem = TrayCreateItem("About")
TraySetState()
;==> Trayicon Erweitern Ende

GUISetState(@SW_SHOW)
If $fullscreen =1 Then
	GUISetState(@SW_MAXIMIZE, $hGUI)
	FensterMessenSC()
EndIf

FensterMessenMC()

$hFullScreen = WinGetHandle("Program Manager")
$aFullScreen = WinGetPos($hFullScreen)

$Guten = GUICtrlCreateLabel("Guten Tag " & $Name1 & "." & @CRLF & "Hier ist " & $Name2 & ".    " & @CRLF & @CRLF & "Ich wünsche dir viel Vergnügen", $weite / 5, $hoehe / 3, $weite, $hoehe / 2)
GUICtrlSetFont(-1, 20, 800, 0, "Hollywood Hills")
GUICtrlSetColor(-1, 0x3399FF)
Sleep(1000)
GUICtrlDelete($Guten)

dllcallgdi32()
GUISetState(@SW_ENABLE,$hGUI)

While 1
	$msg = TrayGetMsg()
	Select
		Case $msg = $displayitem
			GUISetState(@SW_MAXIMIZE, $hGUI)
			$fullscreen = 1
			FensterMessenSC()
		Case $msg = $nodrag
			If $drag = 0 Then
				GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
				$drag =1
			Else
				GUIRegisterMsg($WM_NCHITTEST, "")
				$drag = 0
			EndIf
			IniWrite($sFile, "window", "drag", $drag)
		Case $msg = $aboutitem
			MsgBox(64, "About:", "MC anzeiger Beta 2" & @CRLF & "Develpoer and Owner: Maximus1" & @CRLF & "05.06.2011")
		Case $msg = $settingsitem
			RunWait(@ScriptDir & "\options.exe", "")
			iniread_lesen()
			dllcallgdi32()
	EndSelect
	MClesen()

	$lwmouse = MouseGetPos(0) ;koordinate weite von links oder
    $lhmouse = MouseGetPos(1) ;koordinate höhe von oben oder
    If WinActive($hgui) And $lwmouse > 0 And $lhmouse > 0 And $lwmouse < $weite And $lhmouse < $hoehe Then ;wenn in 1. Fenster geklickt

        ; maus im fenster ratio berechnen
        $w_ratio = $MCpos[2] / $weite
        $h_ratio = ($MCpos[3]--$paaddedborder1) / $hoehe
		; auf rechten bildschirm umrechnen
        $rwmouse = Round (Int($lwmouse * $w_ratio),2)
        $rhmouse = Round (Int($lhmouse * $h_ratio),2)

        ToolTip("drag: "&$drag&@CRLF&"Mousepos_w: " & $lwmouse & "Mousepos_h: " & $lhmouse & @CRLF & "fenstergröße_w: " & $weite & @CRLF & "fenstergröße_h: " & $hoehe & @CRLF & "w_ratio: " & $w_ratio & @CRLF & "h_ratio: " & $h_ratio & @CRLF & "rwmouse: " & $rwmouse & "rhmouse: " & $rhmouse)

        If _IsPressed("01", $userdll) Then ;linke maustaste betätigt
			WinActivate("Windows Media Center")
            ToolTip("")
            MouseClick("left", $rwmouse, $rhmouse--$paaddedborder, 1, 1);maus bewegen und klicken
            Sleep(20);bissl warten
			WinActivate("Desktop")
			MouseMove($lwmouse,$lhmouse,1)
        EndIf
		If _IsPressed("02", $userdll) Then ;linke maustaste betätigt
			WinActivate("Windows Media Center")
            ToolTip("")
            MouseClick("right", $rwmouse, $rhmouse--$paaddedborder, 1, 1);maus bewegen und klicken
            Sleep(20);bissl warten
			WinActivate("Desktop")
			MouseMove($lwmouse,$lhmouse,1)
        EndIf
		If _IsPressed("25", $userdll) Then ;links taste betätigt
			WinActivate("Desktop")
			WinActivate("Windows Media Center")
			Sleep(20)
            ToolTip("")
            Send("{LEFT}")
            Sleep(20);bissl warten
			WinActivate("Desktop")
        EndIf
		If _IsPressed("27", $userdll) Then ;rechts taste betätigt
			WinActivate("Desktop")
			WinActivate("Windows Media Center")
            ToolTip("")
            Send("{RIGHT}")
            Sleep(20);bissl warten
			WinActivate("Desktop")
        EndIf
		If _IsPressed("26", $userdll) Then ;hoch taste betätigt
			WinActivate("Desktop")
			WinActivate("Windows Media Center")
            ToolTip("")
            Send("{UP}")
            Sleep(20);bissl warten
			WinActivate("Desktop")
			MouseMove($lwmouse,$lhmouse,1)
        EndIf
		If _IsPressed("28", $userdll) Then ;runter taste betätigt
			WinActivate("Desktop")
			WinActivate("Windows Media Center")
            ToolTip("")
            Send("{DOWN}")
            Sleep(20);bissl warten
			WinActivate("Desktop")
        EndIf
		If _IsPressed("0D", $userdll) Then ;enter taste betätigt
			WinActivate("Desktop")
			WinActivate("Windows Media Center")
            ToolTip("")
            Send("{ENTER}")
            Sleep(20);bissl warten
			WinActivate("Desktop")
			MouseMove($lwmouse,$lhmouse,1)
        EndIf
		If _IsPressed("08", $userdll) Then ;backspace taste betätigt
			WinActivate("Desktop")
			WinActivate("Windows Media Center")
            ToolTip("")
            Send("{BS}")
            Sleep(20);bissl warten
			WinActivate("Desktop")
        EndIf
    Else
        ToolTip("")
    EndIf
WEnd

Func dllcallgdi32()
	DllCall($hdll_gdi32, "int", "SetStretchBltMode", "dword", $hDC_GUI, "int", $ausg_quali) ;den schönen blit modus anstellen
EndFunc   ;==>dllcallgdi32

Func MClesen()
	_WinAPI_StretchBlt($hDC_GUI, 0--$paaddedborder2-2, $y --$paaddedborder1-2, $weite--$paaddedborder2, $hoehe-$paaddedborder1, $hDC_Desktop, $MCpos[0], $MCpos[1], $MCpos[2], $MCpos[3], $SRCCOPY)
	; titelleiste wird von TOP abgezogen und das gemesseneMC wird in das gemessene/voreingestellte anzeigeprogramm eingepasst
	;Der Befehl  transveriert den Inhalt des Desktop DC's auf die GUI DC und passt dabei die grösse an  das gegenstück ohne grössenanpassung ist _WinAPI_BitBlt
	$counter = $counter + 1
	If $counter = 50 Then; alle 20 durchläufe wird
		FensterMessenMC()
		FensterMessenSC() ; das fenster vom SC gemessen und als neuer richtwert übernommen
		$counter = 0
	EndIf
EndFunc   ;==>MClesen

; Author.........: Yashied
Func _WinAPI_StretchBlt($hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iRop)  ;>== Beispiel WinAPI_StretchBlt

	Local $Ret = DllCall($hdll_gdi32, 'int', 'StretchBlt', 'hwnd', $hDestDC, 'int', $iXDest, 'int', $iYDest, 'int', $iWidthDest, 'int', $iHeightDest, 'hwnd', $hSrcDC, 'int', $iXSrc, 'int', $iYSrc, 'int', $iWidthSrc, 'int', $iHeightSrc, 'dword', $iRop)

	If (@error) Or (Not $Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Return 1
EndFunc   ;==>_WinAPI_StretchBlt

Func FensterMessenMC() ;==>MC wird Vermessen
	$MCpos = WinGetPos("Windows Media Center"); äussere koordinaten des MC abfragen
	If @error Then
		MsgBox(16, "Fehler", "MC Fenster nicht gefunden")
		$fehler = "MC Fenster nicht gefunden"
		CLOSE_error()
	EndIf

EndFunc   ;==>FensterMessenMC

Func FensterMessenSC() ;==>SC wird Vermessen
	$SCpos = WinGetPos("Desktop"); äussere koordinaten des screecapture abfragen
	If @error Then
		MsgBox(16, "Fehler", "screencap Fenster nicht gefunden")
		$fehler = "screencap Fenster nicht gefunden"
		CLOSE_error()
	EndIf
	$weite = $SCpos[2]
	$hoehe = $SCpos[3]
EndFunc   ;==>FensterMessenSC

Func iniwrite_eingabe() ;==>werte werden in die datei geschrieben
	IniWrite($sFile, "widht", "widht", $weite)
	IniWrite($sFile, "height", "height", $hoehe)
	IniWrite($sFile, "Qualität", "level", $ausg_quali)
	IniWrite($sFile, "Benutzer", "Name", $Name1)
	IniWrite($sFile, "System", "Name", $Name2)
EndFunc   ;==>iniwrite_eingabe

Func iniread_lesen() ;==werte werden aus der datei gelesen
	$weite = IniRead($sFile, "widht", "widht", 1)
	$hoehe = IniRead($sFile, "height", "height", 1)
	$SCpos0 = IniRead($sFile, "x", "x", 1)
	$SCpos1 = IniRead($sFile, "y", "y", 1)
	$SCpos2 = IniRead($sFile, "breite", "breite", 1)
	$SCpos3 = IniRead($sFile, "höhe", "höhe", 1)
	$ausg_quali = IniRead($sFile, "Qualität", "level", 1)
	$Name1 = IniRead($sFile, "Benutzer", "Name", 1)
	$Name2 = IniRead($sFile, "System", "Name", 1)
	$box1a = IniRead($sFile, "Start", "Windows", 0)
	$fullscreen = IniRead($sFile, "Start", "Vollbild", 0)
	$drag = IniRead($sFile, "window", "drag", 0)
EndFunc   ;==>iniread_lesen

Func CLOSEClicked() ;==>gute nacht ;-)
	$SCpos = WinGetPos("Desktop"); äussere koordinaten des media center abfragen
	If Not @error Then
		iniwrite_close()
	EndIf
	;benutzte resourcen freigeben
	_WinAPI_ReleaseDC($hGUI, $hDC_GUI)
	_WinAPI_ReleaseDC($hDesktop, $hDC_Desktop)
	Exit
EndFunc   ;==>CLOSEClicked

Func iniwrite_close() ;==>werte für das aneigefenster werden in die datei geschrieben
	IniWrite($sFile, "x", "x", $SCpos[0])
	IniWrite($sFile, "y", "y", $SCpos[1])
	IniWrite($sFile, "breite", "breite", $SCpos[2])
	IniWrite($sFile, "höhe", "höhe", $SCpos[3])
EndFunc   ;==>iniwrite_close

Func CLOSE_error() ;==>abbruch mit fehlerausgabe
	FileOpen("fehler.txt", 1); fehlerdatei öffnen oder erstellen
	FileWriteLine("fehler.txt", "" & @MDAY & "." & @MON & "." & @YEAR & "_" & @HOUR & ":" & @MIN & " " & $fehler & @CRLF); datum und zeit und fehler reinschreiben
	FileClose("fehler.txt")
	_WinAPI_ReleaseDC($hGUI, $hDC_GUI)
	_WinAPI_ReleaseDC($hDesktop, $hDC_Desktop)
	DllClose($hdll_gdi32)
	Exit
EndFunc   ;==>CLOSE_error

Func CLOSE_error_abfrage() ;==>abbruch mit fehlerausgabe
	FileOpen("fehler.txt", 1); fehlerdatei öffnen oder erstellen
	FileWriteLine("fehler.txt", "" & @MDAY & "." & @MON & "." & @YEAR & "_" & @HOUR & ":" & @MIN & " " & $fehler & @CRLF); datum und zeit und fehler reinschreiben
	FileClose("fehler.txt")
	DllClose($hdll_gdi32)
	Exit
EndFunc   ;==>CLOSE_error_abfrage

Func WM_NCHITTEST($hWnd, $msg, $wParam, $lParam) ;==> Fenster verschiebbar machen.
	Local $iProc
	$iProc = DllCall("user32.dll", "int", "DefWindowProc", _
			"hwnd", $hWnd, "int", $msg, "int", $wParam, "int", $lParam)
	If @error Then SetError(@error, 0, 0)
	$iProc = $iProc[0]
	If $iProc = $HTCLIENT Then Return $HTCAPTION
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
