Jump to content

Search the Community

Showing results for tags 'High Contrast Night Mode'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • General
    • Announcements and Site News
    • Administration
  • AutoIt v3
    • AutoIt Help and Support
    • AutoIt Technical Discussion
    • AutoIt Example Scripts
  • Scripting and Development
    • Developer General Discussion
    • Language Specific Discussion
  • IT Administration
    • Operating System Deployment
    • Windows Client
    • Windows Server
    • Office

Categories

  • AutoIt Team
    • Beta
    • MVP
  • AutoIt
    • Automation
    • Databases and web connections
    • Data compression
    • Encryption and hash
    • Games
    • GUI Additions
    • Hardware
    • Information gathering
    • Internet protocol suite
    • Maths
    • Media
    • PDF
    • Security
    • Social Media and other Website API
    • Windows
  • Scripting and Development
  • IT Administration
    • Operating System Deployment
    • Windows Client
    • Windows Server
    • Office

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Member Title


Location


WWW


Interests

Found 1 result

  1. Questions in short. 1. How can I detect if windows is in high contrast mode. Here are MS' notes, but I don't know how to translate that into AI. http://msdn.microsoft.com/en-us/library/system.windows.forms.systeminformation.highcontrast%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2 1. How is it possible to switch themes without an abnoxious popup. I found the the following tool which I will use for now but I would prefer it to be in autoit, but shows that it may be possible. For my example script below it is needed. http://winaero.com/comment.php?comment.news.209 (I am not affilated in any way) Scenario I am pushing out new laptops for guys who work both day and night. They require dark/high contrast at night. The software they use, would automatically toggle the theme for them in XP , however it no longer works with windows 7. Windows 7 has a hotkey to switch to high contrast mode, but the hotkey "left Shift + left Alt + PrtScn" is a pain to use on the laptops, because they need to use the fn (function) key to access the print screen and you need both hands to do it. Which is a problem as they are used in vehicles with limited space, and gear they wear is restrictive. So my plan was to write a script that automatically toggles it on for them at sunset/sunrise. Example Script This is what I have came up with so for, it uses the themeswitcher from the above link. Warning! this only has been tested on windows 7, and will probably any other OS to explode violently. Below is a rouph draft of my script that I am testing. Basically it checks if it after sunsent, if so, it switches to dark theme. To trick it into thinking it is after sunset hack the @hour under the seconds from midnight function. I have to give thanks to tim292stro for and those who replied. #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_UseX64=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include<array.au3> if @OSVersion<>"WIN_7" then MsgBox(0,"","Warning this was meant for windows 7 and may cause other OS to violently explode") Exit EndIf AutoItSetOption("TrayIconDebug", True) AutoItSetOption("ExpandEnvStrings", True) AutoItSetOption("TrayAutoPause", False) Opt("TrayMenuMode", 3) Opt("TrayOnEventMode", 1) #Region #inifile globals============ Global Const $gcsINI_File = @ScriptDir & "\DarkThemeToggle.ini" Global Const $gcsINI_Section = @UserName Global Const $gcsDisabledKey = "Disabled" #EndRegion #inifile globals============ #Region #themswitcher globals Global Const $gcsThemeSwitcherContainerDir = _Inier("ThemeSwitcherContainter", @ScriptDir) Global Const $gcsThemeSwitcher = "ThemeSwitcher.exe" #EndRegion #Region #Theme Switching globals============ Global Const $gsLightTHeme = _Inier("LightTheme", RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes", "CurrentTheme")) Global Const $gsDarkTHeme = _Inier("DarkTheme", "C:\Windows\resources\Ease of Access Themes\hcblack.theme") #EndRegion #Theme Switching globals============ #Region Tray icon globals Global $gbDisabled = _Inier("Disabled", "False") if $gbDisabled="False" OR 0 then $gbDisabled=False Else $gbDisabled=True EndIf Global $ghDisableItem Global $ghCloseItem #EndRegion Tray icon globals #Region #Solar Sunset CONSTANTS# =================================================================================================================== Global Const $gcPi = 4 * ATan(1) Global Const $gcaMonthLength[12] = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] Global Const $iMonthAbrev[12] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] global $gcnLatitude=IniRead($gcsINI_File,$gcsINI_Section,"Latitude",-1111) While $gcnLatitude<-90 OR $gcnLatitude >90 $nReturn=InputBox("Latitude","Enter Latitude, use negative number for South") if @error then Exit _inier("Latitude",$nReturn) WEnd global $gcnLongitude=IniRead($gcsINI_File,$gcsINI_Section,"Latitude",-1111) While $gcnLongitude<-180 OR $gcnLatitude >180 $nReturn=InputBox("Longitude","Enter Longitude, use negative number for east") if @error then Exit _inier("Longitude",$nReturn) WEnd #EndRegion #Solar Sunset CONSTANTS# ========= Func _CheckThemeSwitch() If Not FileExists($gcsThemeSwitcherContainerDir & "\" & $gcsThemeSwitcher) Then MsgBox(0, "error", "Could not find themeswitcher, please download it and put it in the following path:" & $gcsThemeSwitcherContainerDir) ShellExecute("http://winaero.com") Exit EndIf EndFunc ;==>_CheckThemeSwitch _main() Func _Inier($sKey, $xValue) $sReturn = IniRead($gcsINI_File, $gcsINI_Section, $sKey, -1) ConsoleWrite("read ini key:" & $sKey & ", value:" & $xValue & @LF) If $sReturn = -1 Then $sReturn = $xValue IniWrite($gcsINI_File, $gcsINI_Section, $sKey, $xValue) ConsoleWrite("Wrote ini key:" & $sKey & ", value:" & $xValue & @LF) EndIf Return $sReturn EndFunc ;==>_Inier Func _TraySetup() $ghDisableItem = TrayCreateItem("Disable Night Mode") TrayItemSetOnEvent($ghDisableItem, "_ToggleEnabled") $ghCloseItem = TrayCreateItem("Close") TrayItemSetOnEvent($ghCloseItem, "_exit") _CheckDisableTray() EndFunc ;==>_TraySetup Func _ToggleEnabled() $gbDisabled = Not $gbDisabled IniWrite($gcsINI_File, $gcsINI_Section, $gcsDisabledKey, $gbDisabled) _CheckDisableTray() EndFunc ;==>_ToggleEnabled Func _CheckDisableTray() $TRAY_CHECKEd=1 $TRAY_unchecked=4 $Tray_enabled=64 local $state="" ConsoleWrite("Disabled?:"&$gbDisabled & @LF) if $gbDisabled then $state=BitOR($Tray_enabled,$TRAY_CHECKEd) Else $state=BitOR($Tray_enabled,$TRAY_unchecked) EndIf TrayItemSetState($ghDisableItem, $state) EndFunc ;==>_CheckDisableTray Func _main() _TraySetup() Const $ciSunriseIndex = 1 Const $ciSunsetIndex = 3 CONST $icSecondsInADay=86400 Const $cbWarningDialogPrompt = 8 Const $cbNoiseOnToggle = 16 Const $csRegThemeKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes" Const $csRegValue = "CurrentTheme" Local $iSleepSeconds = 60 LOCAL $iSecondsTillChange="" Local $bNight = False Local $sCurrent = "" While 1 $aSolarTimes = _GetSolarAstronimicalData($gcnLatitude,$gcnLongitude) ConsoleWrite("sunrise:" & _SecondsFromMidnight($aSolarTimes[$ciSunriseIndex]) & @LF) ConsoleWrite("Now:&" & _SecondsFromMidnight() & @LF) ConsoleWrite("sunset:" & _SecondsFromMidnight($aSolarTimes[$ciSunsetIndex]) & @LF) $iSunriseFromMidnightSeconds=_SecondsFromMidnight($aSolarTimes[$ciSunriseIndex]) $iNowFromMidnightSeconds=_SecondsFromMidnight() $iSunsSetFromMidnightSeconds=_SecondsFromMidnight($aSolarTimes[$ciSunsetIndex]) SELECT CASE $iNowFromMidnightSeconds<$iSunriseFromMidnightSeconds $iSecondsTillChange=$iSunriseFromMidnightSeconds-$iNowFromMidnightSeconds $bNight=True CASE $iNowFromMidnightSeconds>$iSunsSetFromMidnightSeconds $iSecondsTillChange=$icSecondsInADay-$iNowFromMidnightSeconds $bNight=True case Else $iSecondsTillChange=$iSunsSetFromMidnightSeconds-$iNowFromMidnightSeconds $bNight=False EndSelect $sCurrentTheme = RegRead($csRegThemeKey, $csRegValue) If StringInStr($sCurrentTheme, $gsDarkTHeme) Then $bDarkThemeActive = True Else $bDarkThemeActive = False EndIf If $bNight * (not $bDarkThemeActive) * (Not $gbDisabled) Then _theme($gsDarkTHeme) If (Not $bNight) and $bDarkThemeActive or $gbDisabled Then _theme($gsLightTHeme) $bLast = $gbDisabled For $i = 1 To $iSecondsTillChange Sleep(1000) If $bLast <> $gbDisabled Then ExitLoop Next WEnd EndFunc ;==>_main Func _test() ConsoleWrite(BitAND(4199, 32) & @LF) EndFunc ;==>_test Func _exit() _theme($gsLightTHeme) Exit EndFunc ;==>_exit Func _theme($sThemeFile) static $_sLast="" if $_sLast=$sThemeFile then Return Run('themeswitcher.exe "' & $sThemeFile & '"', $gcsThemeSwitcherContainerDir) ConsoleWrite("Setting theme to " & $sThemeFile & @LF) $_sLast=$sThemeFile EndFunc ;==>_theme Func _SecondsFromMidnight($sHHMM = "") If $sHHMM = "" Then $iSeconds =@HOUR * 3600 + @MIN * 60 Else Const $cHourIndex = 1 Const $cMinuteIndex = 2 $aTime = StringSplit($sHHMM, ":") $iSeconds = $aTime[$cHourIndex] * 3600 + $aTime[$cMinuteIndex] * 60 EndIf Return ($iSeconds) EndFunc ;==>_SecondsFromMidnight ; #CURRENT# ===================================================================================================================== ;_GetSolarAstronimicalData ; =============================================================================================================================== ; #FUNCTION# ==================================================================================================================== ; Name...........: _GetSolarAstronimicalData ; Description ...: CalcuLatitudee the position of the sun reLatitudeive to a position on earth for a given time/date. ; Syntax.........: _GetSolarAstronimicalData ( $Latitudeitude, $Longitude, $iMonth, $MDay, $iYear, $nTotalJulianTimeimeZone, $nHour, $nMinute, $Second, $iDayLightSavingsTime ) ; Parameters ....: $Latitudeitude - The Latitudeitude portion of the earth position to calcuLatitudee the sun's position reLatitudeive to (float) ; $Longitude - The Latitudeitude portion of the earth position to calcuLatitudee the sun's position reLatitudeive to (float) ; $iMonth - The month of the year you are calcuLatitudeing for (numeric-string: "1-12") ; $MDay - The day of the month you are calcuLatitudeing for (numeric-string: "1-31") ; $iYear - The year you are calcuLatitudeing for (numeric-string: "-2000 to 3000") ; $nTotalJulianTimeimeZone - The time zone you are calcuLatitudeing for (numeric-string: "-11 to 12") ; $nHour - Optional! The hour you are calcuLatitudeing for in 24-hrs (numeric-string: "0-23") ; $nMinute - Optional! The minute you are calcuLatitudeing for (numeric-string: "00-59") ; $Second - Optional! The second you are calcuLatitudeing for (numeric-string: "00-59") ; $iDayLightSavingsTime - Optional! Is Daylight Saving's Time in effect? (boolean) ; Return values .: Success - Returns an array with the following values: ; 0 = Element count. If count = 3, then only items 1-3 available. If count = 6, then all elements available) ; 1 = Sunrise time "07:12" 24-hr time, or "07:12 Jul 17" if position is near international date line ; 2 = Solar Noon "13:16:46" 24-hr time with seconds. Higest point of sun in sky. ; 3 = Sunset time "19:22" 24-hr time, or "19:22 Jul 19" if position is near international date line ; 4 = Sun Azimuth in Degreerees reLatitudeive to computed position (0Degree = true north, 180Degree = true south, 90Degree = East, 270 = West) ; 5 = Sun Elevation is Degreerees reLatitudeive to computed position at sea-level ; 6 = Ambient light disposition (possibilities: Day, Civil Twilight, Nautical Twilight, Astronomical Twilight, Night) ; Author ........: Tim Strommen (tim292stro) ; Modified.......: ; Remarks .......: Again, special thanks to NOAA for allowing re-use of their code!! See: "http://www.esrl.noaa.gov/" ; ReLatitudeed .......: ; Link ..........: ; Example .......: Yes ; =============================================================================================================================== Func _GetSolarAstronimicalData($nAstroLatitude = "", $nAstroLong = "", $nAstroMonth = "", $nAstroDay = "", $nAstroYear = "", $nAstroTimeZone = "", $nAstroHour = "", $nAstroMinute = "", $nAstroSecond = "", $AstroDST = False) Local $aSolarTimes[7] If ($nAstroLatitude = "") Or ($nAstroLong = "") Then ; Return current Greenwich, UK basic times with current solar position $nAstroLatitude = "51.48" $nAstroLong = "0.000000001" $nAstroTimeZone = "0" $nAstroMonth = @MON $nAstroDay = @MDAY $nAstroYear = @YEAR $nAstroHour = @HOUR $nAstroMinute = @MIN $nAstroSecond = @SEC $aSolarTimes = _SolarCalcuLatitudee($nAstroLatitude, $nAstroLong, $nAstroMonth, $nAstroDay, $nAstroYear, $nAstroTimeZone, $nAstroHour, $nAstroMinute, $nAstroSecond, $AstroDST, True) Return $aSolarTimes ElseIf $nAstroHour = "" Then ; Just return the specified day's basic times, no current solar position $nAstroHour = "12" $nAstroMinute = "00" $nAstroSecond = "00" $aSolarTimes = _SolarCalcuLatitudee($nAstroLatitude, $nAstroLong, $nAstroMonth, $nAstroDay, $nAstroYear, $nAstroTimeZone, $nAstroHour, $nAstroMinute, $nAstroSecond, $AstroDST, False) Return $aSolarTimes Else ; Return both the basic times, plus the current solar position $aSolarTimes = _SolarCalcuLatitudee($nAstroLatitude, $nAstroLong, $nAstroMonth, $nAstroDay, $nAstroYear, $nAstroTimeZone, $nAstroHour, $nAstroMinute, $nAstroSecond, $AstroDST, True) Return $aSolarTimes EndIf EndFunc ;==>_GetSolarAstronimicalData Func _CalcTimeJulianCent($nJulianDay = 0) Local $nJulianTime = ($nJulianDay - 2451545.0) / 36525.0 Return $nJulianTime EndFunc ;==>_CalcTimeJulianCent Func _CalcJDFromJulianCent($nTotalJulianTime = 0) Local $nJulianDay = $nTotalJulianTime * 36525.0 + 2451545.0 Return $nJulianDay EndFunc ;==>_CalcJDFromJulianCent Func _isLeapYear($yr = 0) Return ((Mod($yr, 4) And Mod($yr, 100)) Or (Mod($yr, 400) = 0)) EndFunc ;==>_isLeapYear Func _calcDoyFromJD($nJulianDay = 0) Local $z = Floor($nJulianDay + 0.5) Local $f = ($nJulianDay + 0.5) - $z Local $iStepA, $alpha, $iStepB, $iStepC, $iStepD, $nDayOfYear, $iStepE, $iDay, $iMonth, $iYear, $iLeapYear If $z < 2299161 Then $iStepA = $z Else $alpha = Floor(($z - 1867216.25) / 36524.25) $iStepA = $z + 1 + $alpha - Floor($alpha / 4) EndIf $iStepB = $iStepA + 1524 $iStepC = Floor(($iStepB - 122.1) / 365.25) $iStepD = Floor(365.25 * $iStepC) $iStepE = Floor(($iStepB - $iStepD) / 30.6001) $iDay = $iStepB - $iStepD - Floor(30.6001 * $iStepE) + $f If $iStepE < 14 Then $iMonth = $iStepE - 1 Else $iMonth = $iStepE - 13 EndIf If $iMonth > 2 Then $iYear = $iStepC - 4716 Else $iYear = $iStepC - 4715 EndIf If _isLeapYear($iYear) Then $iLeapYear = 1 Else $iLeapYear = 2 EndIf $nDayOfYear = Floor((275 * $iMonth) / 9) - $iLeapYear * Floor(($iMonth + 9) / 12) + $iDay - 30 Return $nDayOfYear EndFunc ;==>_calcDoyFromJD Func _RadeanToDegree($AngleRadean = 0) Return 180.0 * $AngleRadean / $gcPi EndFunc ;==>_RadeanToDegree Func _DegreeToRadean($nAngleDegree = 0) Return $gcPi * $nAngleDegree / 180.0 EndFunc ;==>_DegreeToRadean Func _calcGeomMeanLongSun($nTotalJulianTime = 0) Local $nlLongitudinalMeanSunDegrees = 280.46646 + $nTotalJulianTime * (36000.76983 + $nTotalJulianTime * (0.0003032)) While $nlLongitudinalMeanSunDegrees > 360.0 $nlLongitudinalMeanSunDegrees -= 360.0 WEnd While $nlLongitudinalMeanSunDegrees < 0.0 $nlLongitudinalMeanSunDegrees += 360.0 WEnd Return $nlLongitudinalMeanSunDegrees ; in Degreerees EndFunc ;==>_calcGeomMeanLongSun Func _calcGeomMeanAnomalySun($nTotalJulianTime = 0) Local $nSunMeanAnomalyRadeans = 357.52911 + $nTotalJulianTime * (35999.05029 - 0.0001537 * $nTotalJulianTime) Return $nSunMeanAnomalyRadeans ; in Degreerees EndFunc ;==>_calcGeomMeanAnomalySun Func _calcEccentricityEarthOrbit($nTotalJulianTime = 0) Local $iStepE = 0.016708634 - $nTotalJulianTime * (0.000042037 + 0.0000001267 * $nTotalJulianTime) Return $iStepE ; unitless EndFunc ;==>_calcEccentricityEarthOrbit Func _calcSunEqOfCenter($nTotalJulianTime = 0) Local $nSunMeanAnomalyRadeans = _calcGeomMeanAnomalySun($nTotalJulianTime) Local $mRadean = _DegreeToRadean($nSunMeanAnomalyRadeans) Local $nSinmRadeans = Sin($mRadean) Local $sin2m = Sin($mRadean + $mRadean) Local $sin3m = Sin($mRadean + $mRadean + $mRadean) Local $iStepC = $nSinmRadeans * (1.914602 - $nTotalJulianTime * (0.004817 + 0.000014 * $nTotalJulianTime)) + $sin2m * (0.019993 - 0.000101 * $nTotalJulianTime) + $sin3m * 0.000289 Return $iStepC EndFunc ;==>_calcSunEqOfCenter Func _calcSunTrueLong($nTotalJulianTime = 0) Local $lo = _calcGeomMeanLongSun($nTotalJulianTime) Local $iStepC = _calcSunEqOfCenter($nTotalJulianTime) Local $O = $lo + $iStepC Return $O ; in Degreerees EndFunc ;==>_calcSunTrueLong Func _calcSunTrueAnomaly($nTotalJulianTime = 0) Local $nSunMeanAnomalyRadeans = _calcGeomMeanAnomalySun($nTotalJulianTime) Local $iStepC = _calcSunEqOfCenter($nTotalJulianTime) Local $v = $nSunMeanAnomalyRadeans + $iStepC Return $v EndFunc ;==>_calcSunTrueAnomaly Func _calcSunRadeanVector($nTotalJulianTime = 0) Local $v = _calcSunTrueAnomaly($nTotalJulianTime) Local $iStepE = _calcEccentricityEarthOrbit($nTotalJulianTime) Local $R = (1.000001018 * (1 - $iStepE * $iStepE)) / (1 + $iStepE * Cos(_DegreeToRadean($v))) Return $R ; in AUs EndFunc ;==>_calcSunRadeanVector Func _calcSunApparentLong($nTotalJulianTime = 0) Local $O = _calcSunTrueLong($nTotalJulianTime) Local $omega = 125.04 - 1934.136 * $nTotalJulianTime Local $lambda = $O - 0.00569 - 0.00478 * Sin(_DegreeToRadean($omega)) Return $lambda ; in Degreerees EndFunc ;==>_calcSunApparentLong Func _calcMeanObliquityOfEcliptic($nTotalJulianTime = 0) Local $seconds = 21.448 - $nTotalJulianTime * (46.8150 + $nTotalJulianTime * (0.00059 - $nTotalJulianTime * (0.001813))) Local $e0 = 23.0 + (26.0 + ($seconds / 60.0)) / 60.0 Return $e0 ; in Degreerees EndFunc ;==>_calcMeanObliquityOfEcliptic Func _calcObliquityCorrection($nTotalJulianTime = 0) Local $e0 = _calcMeanObliquityOfEcliptic($nTotalJulianTime) Local $omega = 125.04 - 1934.136 * $nTotalJulianTime Local $iStepE = $e0 + 0.00256 * Cos(_DegreeToRadean($omega)) Return $iStepE EndFunc ;==>_calcObliquityCorrection Func _calcSunRtAscension($nTotalJulianTime = 0) Local $iStepE = _calcObliquityCorrection($nTotalJulianTime) Local $lambda = _calcSunApparentLong($nTotalJulianTime) Local $nTotalJulianTimeananum = (Cos(_DegreeToRadean($iStepE)) * Sin(_DegreeToRadean($lambda))) Local $nTotalJulianTimeanadenom = (Cos(_DegreeToRadean($lambda))) Local $alpha = _RadeanToDegree(_atan2($nTotalJulianTimeananum, $nTotalJulianTimeanadenom)) Return $alpha ; in Degreerees EndFunc ;==>_calcSunRtAscension Func _atan2($x, $nYRadeans) If $nYRadeans < 0 Then Return -_atan2($x, -$nYRadeans) ElseIf $x < 0 Then Return $gcPi - ATan(-$nYRadeans / $x) ElseIf $x > 0 Then Return ATan($nYRadeans / $x) ElseIf $nYRadeans <> 0 Then Return $gcPi / 2 Else MsgBox(16, "Error - Division by zero", "Domain Error in Function: ATan2()" & @LF & "$x and $nYRadeans cannot both equal zero") SetError(1) EndIf EndFunc ;==>_atan2 Func _calcSunDeclination($nTotalJulianTime = 0) Local $iStepE = _calcObliquityCorrection($nTotalJulianTime) Local $lambda = _calcSunApparentLong($nTotalJulianTime) Local $sint = Sin(_DegreeToRadean($iStepE)) * Sin(_DegreeToRadean($lambda)) Local $nTotalJulianTimeheta = _RadeanToDegree(ASin($sint)) Return $nTotalJulianTimeheta ; in Degreerees EndFunc ;==>_calcSunDeclination Func _calcEquationOfTime($nTotalJulianTime = 0) Local $nObligiquityCorrection = _calcObliquityCorrection($nTotalJulianTime) Local $nlLongitudinalMeanSunDegrees = _calcGeomMeanLongSun($nTotalJulianTime) Local $iEccentricEarthOrbit = _calcEccentricityEarthOrbit($nTotalJulianTime) Local $nSunMeanAnomalyRadeans = _calcGeomMeanAnomalySun($nTotalJulianTime) Local $nYRadeans = Tan(_DegreeToRadean($nObligiquityCorrection) / 2.0) $nYRadeans *= $nYRadeans Local $nSin2l0Radeans = Sin(2.0 * _DegreeToRadean($nlLongitudinalMeanSunDegrees)) Local $nSinmRadeans = Sin(_DegreeToRadean($nSunMeanAnomalyRadeans)) Local $cos2l0Radeans = Cos(2.0 * _DegreeToRadean($nlLongitudinalMeanSunDegrees)) Local $sin4l0Radeans = Sin(4.0 * _DegreeToRadean($nlLongitudinalMeanSunDegrees)) Local $sin2m = Sin(2.0 * _DegreeToRadean($nSunMeanAnomalyRadeans)) Local $Etime = $nYRadeans * $nSin2l0Radeans - 2.0 * $iEccentricEarthOrbit * $nSinmRadeans + 4.0 * $iEccentricEarthOrbit * $nYRadeans * $nSinmRadeans * $cos2l0Radeans - 0.5 * $nYRadeans * $nYRadeans * $sin4l0Radeans - 1.25 * $iEccentricEarthOrbit * $iEccentricEarthOrbit * $sin2m Return _RadeanToDegree($Etime) * 4.0 ; in minutes of time EndFunc ;==>_calcEquationOfTime ;SunRise = Horizon+0.8333 Func _calcHourAngleSunrise($Latitude, $solarDec) Local $LatitudeRadean = _DegreeToRadean($Latitude) Local $sdRadean = _DegreeToRadean($solarDec) Local $HAarg = (Cos(_DegreeToRadean(90.833)) / (Cos($LatitudeRadean) * Cos($sdRadean)) - Tan($LatitudeRadean) * Tan($sdRadean)) Local $nSunAngleTerminationRadeans = ACos($HAarg) Return $nSunAngleTerminationRadeans ; in Radeanians for morning (for evening, use -HA) EndFunc ;==>_calcHourAngleSunrise ;CivilTwilight = (Horizon+6) < SunCenter < (Horizon+0.8333) Func _calcHourAngleCivilTwilight($Latitude, $solarDec) Local $LatitudeRadean = _DegreeToRadean($Latitude) Local $sdRadean = _DegreeToRadean($solarDec) Local $HAarg = (Cos(_DegreeToRadean(96.0)) / (Cos($LatitudeRadean) * Cos($sdRadean)) - Tan($LatitudeRadean) * Tan($sdRadean)) Local $nSunAngleTerminationRadeans = ACos($HAarg) Return $nSunAngleTerminationRadeans ; in Radeanians for morning (for evening, use -HA) EndFunc ;==>_calcHourAngleCivilTwilight Func _isNumber($inputval) Return (IsFloat($inputval) Or IsNumber($inputval) Or IsInt($inputval)) EndFunc ;==>_isNumber Func _zeroPad($n, $digits) $n = String($n) While StringLen($n) < $digits $n = "0" & $n WEnd Return $n EndFunc ;==>_zeroPad Func _GetJulianDay($CompJDMon = "", $CompJDDay = "", $CompJDYear = "") If ((_isLeapYear($CompJDYear)) And ($CompJDMon = 2)) Then If $CompJDDay > 29 Then $CompJDDay = 29 EndIf Else If $CompJDDay > $gcaMonthLength[$CompJDMon] Then $CompJDDay = $gcaMonthLength[$CompJDMon] EndIf EndIf If $CompJDMon <= 2 Then $CompJDYear -= 1 $CompJDMon += 12 EndIf Local $iStepA = Floor($CompJDYear / 100) Local $iStepB = 2 - $iStepA + Floor($iStepA / 4) Local $nJulianDay = Floor(365.25 * ($CompJDYear + 4716)) + Floor(30.6001 * ($CompJDMon + 1)) + $CompJDDay + $iStepB - 1524.5 Return $nJulianDay EndFunc ;==>_GetJulianDay Func _getTimeLocal($CompHour = "", $CompMin = "", $CompSec = "", $CompDST = False) If ($CompDST) Then $CompHour -= 1 EndIf Local $mins = $CompHour * 60 + $CompMin + $CompSec / 60.0 Return $mins EndFunc ;==>_getTimeLocal Func _CalcuLatitudeeAzimuthElivation($nTotalJulianTime, $localtime, $Latitudeitude, $longitude, $zone) Local $SolarReturnAzEl[1] = [0] Local $SolarLightStatus, $nAzimuthRadean Local $eqTime = _calcEquationOfTime($nTotalJulianTime) Local $nTotalJulianTimeheta = _calcSunDeclination($nTotalJulianTime) Local $solarTimeFix = $eqTime + 4.0 * $longitude - 60.0 * $zone Local $nTotalJulianTimerueSolarTime = $localtime + $solarTimeFix While $nTotalJulianTimerueSolarTime > 1440 $nTotalJulianTimerueSolarTime -= 1440 WEnd Local $nHourAngle = $nTotalJulianTimerueSolarTime / 4.0 - 180.0; If $nHourAngle < -180 Then $nHourAngle += 360.0 EndIf Local $haRadean = _DegreeToRadean($nHourAngle) Local $csz = Sin(_DegreeToRadean($Latitudeitude)) * Sin(_DegreeToRadean($nTotalJulianTimeheta)) + Cos(_DegreeToRadean($Latitudeitude)) * Cos(_DegreeToRadean($nTotalJulianTimeheta)) * Cos($haRadean) If $csz > 1.0 Then $csz = 1.0 ElseIf $csz < -1.0 Then $csz = -1.0 EndIf Local $zenith = _RadeanToDegree(ACos($csz)) Local $azDenom = (Cos(_DegreeToRadean($Latitudeitude)) * Sin(_DegreeToRadean($zenith))) If Abs($azDenom) > 0.001 Then $nAzimuthRadean = ((Sin(_DegreeToRadean($Latitudeitude)) * Cos(_DegreeToRadean($zenith))) - Sin(_DegreeToRadean($nTotalJulianTimeheta))) / $azDenom If Abs($nAzimuthRadean) > 1.0 Then If $nAzimuthRadean < 0 Then $nAzimuthRadean = -1.0 Else $nAzimuthRadean = 1.0 EndIf EndIf Local $azimuth = 180.0 - _RadeanToDegree(ACos($nAzimuthRadean)) If $nHourAngle > 0.0 Then $azimuth = -$azimuth EndIf Else If $Latitudeitude > 0.0 Then $azimuth = 180.0 Else $azimuth = 0.0 EndIf EndIf If $azimuth < 0.0 Then $azimuth += 360.0 EndIf Local $exoatmElevation = 90.0 - $zenith ; Atmospheric Refraction correction If $exoatmElevation > 85.0 Then Local $refractionCorrection = 0.0 Else Local $nTotalJulianTimee = Tan(_DegreeToRadean($exoatmElevation)) If $exoatmElevation > 5.0 Then $refractionCorrection = 58.1 / $nTotalJulianTimee - 0.07 / ($nTotalJulianTimee * $nTotalJulianTimee * $nTotalJulianTimee) + 0.000086 / ($nTotalJulianTimee * $nTotalJulianTimee * $nTotalJulianTimee * $nTotalJulianTimee * $nTotalJulianTimee) ElseIf $exoatmElevation > -0.575 Then $refractionCorrection = 1735.0 + $exoatmElevation * (-518.2 + $exoatmElevation * (103.4 + $exoatmElevation * (-12.79 + $exoatmElevation * 0.711))) Else $refractionCorrection = -20.774 / $nTotalJulianTimee EndIf $refractionCorrection = $refractionCorrection / 3600.0 EndIf Local $solarZen = $zenith - $refractionCorrection If $solarZen > 108.0 Then $SolarLightStatus = "Night" ElseIf ((108.0 > $solarZen) And ($solarZen >= 102.0)) Then $SolarLightStatus = "Astronomical Twilight" ElseIf ((102.0 > $solarZen) And ($solarZen >= 96.0)) Then $SolarLightStatus = "Nautical Twilight" ElseIf ((96.0 > $solarZen) And ($solarZen >= 90.8333)) Then $SolarLightStatus = "Civil Twilight" Else $SolarLightStatus = "Day" EndIf _ArrayAdd($SolarReturnAzEl, Floor((($azimuth * 100) + 0.5) / 100.0)) _ArrayAdd($SolarReturnAzEl, Floor((90.0 - $solarZen) * 100 + 0.5) / 100.0) _ArrayAdd($SolarReturnAzEl, $SolarLightStatus) _ArrayDelete($SolarReturnAzEl, 0) Return ($SolarReturnAzEl) EndFunc ;==>_CalcuLatitudeeAzimuthElivation Func _calcSolNoon($nJulianDay, $longitude, $nTotalJulianTimeimezone, $iDayLightSavingsTime) Local $nJulianTimeNoon = _CalcTimeJulianCent($nJulianDay - $longitude / 360.0) Local $eqTime = _calcEquationOfTime($nJulianTimeNoon) Local $solNoonOffset = 720.0 - ($longitude * 4) - $eqTime ; in minutes Local $nJulianNoonOffset = _CalcTimeJulianCent($nJulianDay + $solNoonOffset / 1440.0) $eqTime = _calcEquationOfTime($nJulianNoonOffset) Local $nSunAtNoonLocal = 720 - ($longitude * 4) - $eqTime + ($nTotalJulianTimeimezone * 60.0) ; in minutes If $iDayLightSavingsTime Then $nSunAtNoonLocal += 60.0 Return _timeString($nSunAtNoonLocal, 3) EndFunc ;==>_calcSolNoon Func _dayString($nJulianDay, $next, $iFlag) ; returns a string in the form DDMMMYYYY[ next] to display prev/next rise/set ; flag=2 for DD MMM, 3 for DD MM YYYY, 4 for YYYYMMDD next/prev Local $sOutPut, $iStepA If ($nJulianDay < 900000) Or ($nJulianDay > 2817000) Then $sOutPut = "error" SetError(1) Return $sOutPut EndIf Local $z = Floor($nJulianDay + 0.5) Local $f = ($nJulianDay + 0.5) - $z If $z < 2299161 Then $iStepA = $z Else Local $alpha = Floor(($z - 1867216.25) / 36524.25) $iStepA = $z + 1 + $alpha - Floor($alpha / 4) EndIf Local $iStepB = $iStepA + 1524 Local $iStepC = Floor(($iStepB - 122.1) / 365.25) Local $iStepD = Floor(365.25 * $iStepC) Local $iStepE = Floor(($iStepB - $iStepD) / 30.6001) Local $iDay = $iStepB - $iStepD - Floor(30.6001 * $iStepE) + $f Local $iMonth If $iStepE < 14 Then $iMonth = $iStepE - 1 Else $iMonth = $iStepE - 13 EndIf Local $iYear If $iMonth > 2 Then $iYear = $iStepC - 4716 Else $iYear = $iStepC - 4715 EndIf Switch $iFlag Case 2 $sOutPut = _zeroPad($iDay, 2) & " " & $iMonthAbrev[$iMonth - 1] Case 3 $sOutPut = _zeroPad($iDay, 2) & $iMonthAbrev[$iMonth - 1] & String($iYear) Case 4 If $next Then $sOutPut = String($iYear) & $iMonthAbrev[$iMonth - 1] & _zeroPad($iDay, 2) Else $sOutPut = String($iYear) & $iMonthAbrev[$iMonth - 1] & _zeroPad($iDay, 2) EndIf EndSwitch Return $sOutPut EndFunc ;==>_dayString Func _TimeDateString($nJulianDay, $nMinutes) Local $sOutPut = _timeString($nMinutes, 2) & " " & _dayString($nJulianDay, 0, 2) Return $sOutPut EndFunc ;==>_TimeDateString Func _timeString($nMinutes, $iFlag) ; timeString returns a zero-padded string (HH:MM:SS) given time in minutes ; flag=2 for HH:MM, 3 for HH:MM:SS If (($nMinutes >= 0) And ($nMinutes < 1440)) Then Local $bFloatHour = $nMinutes / 60.0 Local $nHour = Floor($bFloatHour) Local $nFloatMinute = 60.0 * ($bFloatHour - Floor($bFloatHour)) Local $nMinute = Floor($nFloatMinute) Local $nFloatSecond = 60.0 * ($nFloatMinute - Floor($nFloatMinute)) Local $second = Floor($nFloatSecond + 0.5) If ($second > 59) Then $second = 0 $nMinute += 1 EndIf If (($iFlag = 2) And ($second >= 30)) Then $nMinute += 1 If ($nMinute > 59) Then $nMinute = 0 $nHour += 1 EndIf Local $sOutPut = _zeroPad($nHour, 2) & ":" & _zeroPad($nMinute, 2) If $iFlag > 2 Then $sOutPut = $sOutPut & ":" & _zeroPad($second, 2) Else $sOutPut = "error" EndIf Return $sOutPut EndFunc ;==>_timeString Func _calcSunriseSetUTC($rise, $nJulianDay, $Latitudeitude, $longitude) Local $nTotalJulianTime = _CalcTimeJulianCent($nJulianDay) Local $eqTime = _calcEquationOfTime($nTotalJulianTime) Local $solarDec = _calcSunDeclination($nTotalJulianTime) Local $RiseSetAngle = _calcHourAngleSunrise($Latitudeitude, $solarDec) If Not $rise Then $RiseSetAngle = -$RiseSetAngle Local $delta = $longitude + _RadeanToDegree($RiseSetAngle) Local $nTotalJulianTimeimeUTCRS = 720 - (4.0 * $delta) - $eqTime Return $nTotalJulianTimeimeUTCRS ; in minutes EndFunc ;==>_calcSunriseSetUTC Func _calcSunriseSet($rise, $nJulianDay, $Latitudeitude, $longitude, $nTotalJulianTimeimezone, $iDayLightSavingsTime) ; rise = 1 for sunrise, 0 for sunset Local $nTotalJulianTimeimeUTC = _calcSunriseSetUTC($rise, $nJulianDay, $Latitudeitude, $longitude) Local $nJulianNoonOffsetimeUTC = _calcSunriseSetUTC($rise, $nJulianDay + $nTotalJulianTimeimeUTC / 1440.0, $Latitudeitude, $longitude) If IsNumber($nJulianNoonOffsetimeUTC) Then Local $nTimeLocal = $nJulianNoonOffsetimeUTC + ($nTotalJulianTimeimezone * 60.0) If $iDayLightSavingsTime Then $nTimeLocal += 60.0 Else $nTimeLocal += 0.0 EndIf If (($nTimeLocal >= 0.0) And ($nTimeLocal < 1440.0)) Then Return _timeString($nTimeLocal, 2) Else Local $nIncrement If $nTimeLocal < 0 Then $nIncrement = 1 Else $nIncrement = -1 EndIf While (($nTimeLocal < 0.0) Or ($nTimeLocal >= 1440.0)) $nTimeLocal += $nIncrement * 1440.0 $nJulianDay -= $nIncrement WEnd Return _TimeDateString($nJulianDay, $nTimeLocal) EndIf Else Local $nDayOfYear = _calcDoyFromJD($nJulianDay) If ((($Latitudeitude > 66.4) And ($nDayOfYear > 79) And ($nDayOfYear < 267)) Or (($Latitudeitude < -66.4) And (($nDayOfYear < 83) Or ($nDayOfYear > 263)))) Then If ($rise) Then $nJulianDay = _calcJulianDayofNextPrevRiseSet(0, $rise, $nJulianDay, $Latitudeitude, $longitude, $nTotalJulianTimeimezone, $iDayLightSavingsTime) Else $nJulianDay = _calcJulianDayofNextPrevRiseSet(1, $rise, $nJulianDay, $Latitudeitude, $longitude, $nTotalJulianTimeimezone, $iDayLightSavingsTime) EndIf ;Return _dayString ( $nJulianDay, 0, 3 ) Else If ($rise) Then $nJulianDay = _calcJulianDayofNextPrevRiseSet(1, $rise, $nJulianDay, $Latitudeitude, $longitude, $nTotalJulianTimeimezone, $iDayLightSavingsTime) Else $nJulianDay = _calcJulianDayofNextPrevRiseSet(0, $rise, $nJulianDay, $Latitudeitude, $longitude, $nTotalJulianTimeimezone, $iDayLightSavingsTime) EndIf ;Return _dayString ( $nJulianDay, 0, 3 ) EndIf EndIf EndFunc ;==>_calcSunriseSet Func _calcJulianDayofNextPrevRiseSet($next, $rise, $nJulianDay, $Latitudeitude, $longitude, $nTotalJulianTimez, $iDayLightSavingsTime) Local $nIncrement If $next Then $nIncrement = 1.0 Else $nIncrement = -1.0 EndIf Local $nTotalJulianTimeime = _calcSunriseSetUTC($rise, $nJulianDay, $Latitudeitude, $longitude) While Not IsNumber($nTotalJulianTimeime) $nJulianDay += $nIncrement $nTotalJulianTimeime = _calcSunriseSetUTC($rise, $nJulianDay, $Latitudeitude, $longitude) WEnd Local $nTimeLocal If $iDayLightSavingsTime Then $nTimeLocal = $nTotalJulianTimeime + $nTotalJulianTimez * 60.0 + 60.0 Else $nTimeLocal = $nTotalJulianTimeime + $nTotalJulianTimez * 60.0 EndIf While (($nTimeLocal < 0.0) Or ($nTimeLocal >= 1440.0)) Local $nIncrement2 If $nTimeLocal < 0 Then $nIncrement2 = 1 Else $nIncrement2 = -1 EndIf $nTimeLocal += ($nIncrement2 * 1440.0) $nJulianDay -= $nIncrement2 WEnd Return $nJulianDay EndFunc ;==>_calcJulianDayofNextPrevRiseSet Func _SolarCalcuLatitudee($nCalcLatitudeitude, $bCalcLongitude, $CalcMonth, $CalcDay, $CalcYear, $CalcTz, $nCalcHour, $nCalcMinute, $nCalcSecond, $nCalcDaylighSavingsTime, $CalcCurrent) Local $aSolarCalcuLatitudeeResult[1] = [0] Local $nJulianDay = _GetJulianDay($CalcMonth, $CalcDay, $CalcYear) Local $nTotalJulianTimel = _getTimeLocal($nCalcHour, $nCalcMinute, $nCalcSecond, $nCalcDaylighSavingsTime) Local $nTotalJulianTimez If $CalcTz = "" Then $nTotalJulianTimez = Int($bCalcLongitude / 15) Else $nTotalJulianTimez = $CalcTz EndIf Local $nTotalJulianTimeotal = $nJulianDay + $nTotalJulianTimel / 1440.0 - $nTotalJulianTimez / 24.0 Local $nTotalJulianTime = _CalcTimeJulianCent($nTotalJulianTimeotal) Local $CalcSolNoon = _calcSolNoon($nJulianDay, $bCalcLongitude, $nTotalJulianTimez, $nCalcDaylighSavingsTime) ; Returns String: "HH:MM:SS" ;MsgBox ( 0, "Solar Noon:", $CalcSolNoon ) Local $rise = _calcSunriseSet(1, $nJulianDay, $nCalcLatitudeitude, $bCalcLongitude, $nTotalJulianTimez, $nCalcDaylighSavingsTime) ; Returns String: "HH:MM" or "HH:MM DD Mon" ;MsgBox ( 0, "Sun Rise:", $rise ) Local $set = _calcSunriseSet(0, $nJulianDay, $nCalcLatitudeitude, $bCalcLongitude, $nTotalJulianTimez, $nCalcDaylighSavingsTime) ; Returns String: "HH:MM" or "HH:MM DD Mon" ;MsgBox ( 0, "Sun Set:", $set ) _ArrayAdd($aSolarCalcuLatitudeeResult, $rise) _ArrayAdd($aSolarCalcuLatitudeeResult, $CalcSolNoon) _ArrayAdd($aSolarCalcuLatitudeeResult, $set) $aSolarCalcuLatitudeeResult[0] += 3 If $CalcCurrent Then Local $CalcAzEl = _CalcuLatitudeeAzimuthElivation($nTotalJulianTime, $nTotalJulianTimel, $nCalcLatitudeitude, $bCalcLongitude, $nTotalJulianTimez) ; Returns Array: 0 - Azimuth, 1 - Elevation, 2 - Illumination-Disposition _ArrayConcatenate($aSolarCalcuLatitudeeResult, $CalcAzEl) $aSolarCalcuLatitudeeResult[0] += 3 EndIf Return $aSolarCalcuLatitudeeResult EndFunc ;==>_SolarCalcuLatitudee I will use the method in the following link unless someone has a better idea '?do=embed' frameborder='0' data-embedContent>>
×
×
  • Create New...