; AutoIT 3.3.0 !!
;
; - read WMI items and show as Progressbar

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>

AutoItSetOption("MustDeclareVars", 1)
; AutoItSetOption("TrayIconDebug", 1)
AutoItSetOption("WinTitleMatchMode", 1) 
AutoItSetOption("GUIOnEventMode", 1)  ; Change to OnEvent mode
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_outfile=wmi_CPU_watch_Vertical.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

Dim Const $WinHigh = 758, $WinWidth = 112, $ApplicationRegName = "HKEY_LOCAL_MACHINE\SOFTWARE\CPU_Watch_wmi"
Dim Const $WinRegKey4NIC = "NIC_Name"
Dim Const $WindowLabel = "CWatch", $Testmode = 0
Dim $whMain, $whProgressCPU0, $whProgressCPU1, $whCPUTemp, $whProc0Freq, $whProc1Freq, $whLblC0, $whLblC1, $whCore0, $whCore1, $whLbManf, $whLbSMIVers, $whLbCPU
Dim $nWinPos[4], $szNICName, $RegNotSet, $whBtnClose, $whCbNICName, $whProgNetw, $whNetVal, $whSpeedCl
Dim $nSMBiosPuffer[8192], $szHerst, $szBoard, $szProcName, $szProcMan, $szSMBiosVersion

$RegNotSet = False
$nWinPos[0] = RegRead($ApplicationRegName, "WindowPosX")
If @error Then
	$RegNotSet = True ; setze flag
Else
	$nWinPos[1] = RegRead($ApplicationRegName, "WindowPosY")
	If @error Then $RegNotSet = True ; setze auch hier flag.
EndIf
If $RegNotSet Then
	$whMain = GUICreate ($WindowLabel, $WinWidth, $WinHigh, 100, 50, BitOR( $WS_CAPTION, $WS_POPUP) ) ; Hauptfenster
Else
	$whMain = GUICreate ($WindowLabel, $WinWidth, $WinHigh, $nWinPos[0], $nWinPos[1], BitOR( $WS_CAPTION, $WS_POPUP) )
EndIf

;GUISetFont(10, 800, 0, "Tahoma")
#Region ### START Koda GUI section ### Form=H:\Work\CPROG\AutoIt\WMI_CPU\WMI Test.kxf
; $whMain = GUICreate("CWatch", 121, 758, 194, 121, $WS_POPUP, $WS_EX_TOOLWINDOW)
$whLblC0 = GUICtrlCreateLabel("Core0", 8, 400, 49, 22)
GUICtrlSetFont($whLblC0, 10, 800, 0, "Tahoma")
$whLblC1 = GUICtrlCreateLabel("Core1", 8, 128, 49, 22)
GUICtrlSetFont($whLblC1, 10, 800, 0, "Tahoma")
$whCore1 = GUICtrlCreateLabel("%", 8, 160, 62, 22)
GUICtrlSetFont($whCore1, 10, 800, 0, "Tahoma")
$whCore0 = GUICtrlCreateLabel("%", 8, 440, 62, 22)
GUICtrlSetFont($whCore0, 10, 800, 0, "Tahoma")
$whProgressCPU1 = GUICtrlCreateProgress(80, 120, 17, 201, BitOR($PBS_SMOOTH,$PBS_VERTICAL,$WS_BORDER))
$whProgressCPU0 = GUICtrlCreateProgress(80, 393, 17, 199, BitOR($PBS_SMOOTH,$PBS_VERTICAL,$WS_BORDER))
$whCPUTemp = GUICtrlCreateLabel("°C", 8, 8, 70, 22)
GUICtrlSetFont($whCPUTemp, 10, 800, 0, "Tahoma")
$whProc1Freq = GUICtrlCreateLabel("MHz", 8, 88, 100, 22)
GUICtrlSetFont($whProc1Freq, 10, 800, 0, "Tahoma")
$whProc0Freq = GUICtrlCreateLabel("MHz", 8, 360, 100, 22)
GUICtrlSetFont($whProc0Freq, 10, 800, 0, "Tahoma")
$whLbSMIVers = GUICtrlCreateLabel("whLbSMIVers", 8, 736, 102, 17)
$whLbManf = GUICtrlCreateLabel("whLbManf", 8, 696, 102, 33)
$whLbCPU = GUICtrlCreateLabel("whLbCPU", 8, 40, 100, 33)
$whBtnClose = GUICtrlCreateButton("X", 88, 8, 17, 17)
GUICtrlSetFont($whBtnClose, 11, 800, 0, "Tahoma")
$whProgNetw = GUICtrlCreateProgress(8, 624, 92, 17, $PBS_SMOOTH)
$whNetVal = GUICtrlCreateLabel("MBit/s", 8, 648, 95, 20)
GUICtrlSetFont($whNetVal, 9, 800, 0, "Tahoma")
$whSpeedCl = GUICtrlCreateLabel("MBit", 8, 672, 96, 20)
GUICtrlSetFont($whSpeedCl, 9, 800, 0, "Tahoma")
$whCbNICName = GUICtrlCreateCombo("whCbNICName", 8, 600, 98, 46, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUICtrlSetOnEvent($whBtnClose, "do_break_event")
GUICtrlSetOnEvent($whCbNICName, "do_set_nic_name")

; ---- init
$szNICName = RegRead($ApplicationRegName, $WinRegKey4NIC)
If @error Then	
	do_determine_nic(True)  ;  init combobox and open msgbox.
Else
	do_determine_nic(False)	; init combobox ....
	GUICtrlSetData($whCbNICName, $szNICName)    ; set the default item.
EndIf
GUICtrlSetState($whCore1, $GUI_DISABLE)			; disable gui items.
GUICtrlSetState($whLblC1, $GUI_DISABLE)
GUICtrlSetState($whCPUTemp, $GUI_DISABLE)
GUICtrlSetState($whProc1Freq, $GUI_DISABLE)
GUICtrlSetState($whProgressCPU1, $GUI_DISABLE)

; Init - read SMI BIOS data:
do_get_SMIBios_data()
; go in loop
While 1
	$szNICName = RegRead($ApplicationRegName, $WinRegKey4NIC)
	do_set_ProcessorFreq()		; show current freq.
	do_get_CPUtime_from_wmi()	; show current CPU time used
	do_set_prog_color()			; set color of progress bars
	do_get_netperf_from_wmi()	; show current network data rate
	do_set_TrayToolTipTitle()	; set tray icon tooltip
; 	Sleep(400) --> get_netperf_from_wmi 
WEnd
Exit

Func do_set_TrayToolTipTitle()
Local $sztmp, $lnC0, $lnC1, $lnC0freq, $lnC1freq

$lnC0 = GUICtrlRead( $whCore0)
$lnC1 = GUICtrlRead( $whCore1)
$lnC0freq = Int(GUICtrlRead( $whProc0Freq ))
$lnC1freq = Int(GUICtrlRead( $whProc1Freq))
$sztmp = StringFormat(" - Core0: %s (%i MHz) Core1: %s (%i MHz)", $lnC0, $lnC0freq, $lnC1, $lnC1freq )
TraySetToolTip( $sztmp )
;WinSetTitle($WindowLabel, "", $WindowLabel & $sztmp )      ; append values to title - best for a horizontal window layout, not here.
EndFunc

Func do_get_CPUtime_from_wmi()
; try to get PerfFormattedData from WMI
; Returns True if success or False if failed.
Local $nObj, $objColItems, $objWMIService, $strComputer = "localhost", $begin, $nResult, $szName

$objWMIService=ObjGet("winmgmts:\\" &$strComputer &"\root\CIMV2")
If @error Then Return False
; read the formatted value - its easy to use.
$objColItems=$objWMIService.ExecQuery("select * from Win32_PerfFormattedData_PerfOS_Processor", "WQL") 
; names of object items are very different. Use the "WMI Explorer" tool to find out, what you need.
If Not IsObj($objColItems) Then   Return False
For $objItem In $objColItems
	$nResult = $objItem.PercentProcessorTime
	$szName = $objItem.Name
	If $szName = "0" Then GUICtrlSetData($whCore0, string($nResult) & " %" )
	If $szName = "0" Then GUICtrlSetData($whProgressCPU0, $nResult)
	If $szName = "1" Then GUICtrlSetData($whCore1, string($nResult) & " %" )
	If $szName = "1" Then GUICtrlSetData($whProgressCPU1, $nResult)
Next
Return True
; no errors.
EndFunc

Func do_set_prog_color()
Local $nValue

$nValue = GUICtrlRead( $whProgressCPU0 )
Switch $nValue
	Case 1 To 33 
		GUICtrlSetColor( $whProgressCPU0, 0x50c011)
	Case 34 to 67
		GUICtrlSetColor( $whProgressCPU0, 0xfcf221)
	Case 68 to 100
		GUICtrlSetColor( $whProgressCPU0, 0xcf1010)
EndSwitch
$nValue = GUICtrlRead( $whProgressCPU1 )
Switch $nValue
	Case 1 To 33 
		GUICtrlSetColor( $whProgressCPU1, 0x50c011)
	Case 34 to 67
		GUICtrlSetColor( $whProgressCPU1, 0xfcf221)
	Case 68 to 100
		GUICtrlSetColor( $whProgressCPU1, 0xcf1010)
EndSwitch
EndFunc

Func do_get_netperf_from_wmi()
; try to get PerfmeterRAW from WMI. Raw data is not calculated for displaying! Search in MSDN for every raw data you have to show.
; rawdata_tcpip_networkinterface - formula = (N2 - N1) / ((D2 - D1) / F)  N = value, D = TimeStamp_PerfTime, F = Frequency_PerfTime
; Current only one network-Interface is supported!
; Returns True if success or False if failed.
Local $objColItems, $objWMIService, $strComputer = "localhost", $lnBWMode, $lnByteTotPS, $szName, $lnD1, $lnD2, $lnN1, $lnN2

$objWMIService=ObjGet("winmgmts:\\" &$strComputer &"\root\CIMV2")
If @error Then Return False
; names of object items are very different. Use the "WMI Explorer" tool to find out, what you need.
$objColItems=$objWMIService.ExecQuery("select * from Win32_PerfRawData_Tcpip_NetworkInterface", "WQL") 
If Not IsObj($objColItems) Then   Return False
For $objItem In $objColItems
	$szName = $objItem.Name
	If StringInStr( $szName, $szNICName) > 0 Then     	; we are on selected network interface ....
		$lnN1 = $objItem.BytesTotalPersec
		$lnD1 = $objItem.Timestamp_PerfTime   ; get timesatmp, Uint64!!!!!!!
	EndIf
Next
Sleep(400)    ; wait for a second value
$objColItems=$objWMIService.ExecQuery("select * from Win32_PerfRawData_Tcpip_NetworkInterface", "WQL") 
If Not IsObj($objColItems) Then   Return False
For $objItem In $objColItems
	$szName = $objItem.Name
	If StringInStr( $szName, $szNICName) > 0 Then     	; we are on selected network interface ....
		$lnN2 = $objItem.BytesTotalPersec
		$lnD2 = $objItem.Timestamp_PerfTime   ; get timesatmp, Uint64!!!!!!!
		$lnByteTotPS = Int( (($lnN2 - $lnN1)/(($lnD2 - $lnD1)/ $objItem.Frequency_PerfTime)) / 1024)   ; calc formula, Bytes per second -> kByte/sec
		$lnBWMode = int( $objItem.CurrentBandwidth / 1000000 )  ; convert bit per secon to MBit per second
; 		MsgBox(64, "Test", StringFormat("values in _get_netperf_from_wmi: N2-N1 = %i \n D2-D1 = %i \n BytesPerSecond = %i", $lnN2-$lnN1, $lnD2-$lnD1, $lnByteTotPS))
		If $lnByteTotPS < 1000 Then 
			GUICtrlSetData($whNetVal, string($lnByteTotPS) & " kB/s" )
		Else
			GUICtrlSetData($whNetVal, string(Round( $lnByteTotPS / 1024, 1)) & " MB/s" )
		EndIf
		Switch $lnByteTotPS   ; is in kByte/sec
		Case 0 To 100
			GUICtrlSetData($whProgNetw, Int( (($lnByteTotPS / 1024) * 100) / ($lnBWMode / 1000) ))  ; calc percent of SpeedClass
			GUICtrlSetColor( $whProgNetw, 0x2020ff)   ; mark blue
		Case 101 To 1000
			GUICtrlSetData($whProgNetw, Int( (($lnByteTotPS / 1024) * 100) / ($lnBWMode / 100) ))  ; calc percent of SpeedClass
			GUICtrlSetColor( $whProgNetw, 0xfcf221)   ; mark yellow
		Case 1001 To 100000
			GUICtrlSetData($whProgNetw, Int( (($lnByteTotPS / 1024) * 100) / ($lnBWMode / 10) ))  ; calc percent of SpeedClass
			GUICtrlSetColor( $whProgNetw, 0x50c011)   ; mark green
		EndSwitch
		GUICtrlSetData($whSpeedCl, string($lnBWMode) & " MBit" )   ; show current speed class
	EndIf
Next
Return True
; no errors.
EndFunc

Func do_set_ProcessorFreq()
Local $objColItems, $objWMIService, $strComputer = "localhost", $lbDual, $nResult, $szName
; if found in WMI then show these current values
$lbDual = False
$objWMIService=ObjGet("winmgmts:\\" &$strComputer &"\root\WMI")
If @error Then Return False
; read the prcessor data from wmi:
$objColItems=$objWMIService.ExecQuery("SELECT * FROM ProcessorPerformance", "WQL") 
If IsObj($objColItems) Then  ; show these values.
;    If $objColItems.Count > 0 Then $lbDual = True     !!!! this will fail - .Count is not valid.
; this example is best for a dual core CPU :-)
    For $objItem In $objColItems
		$lbDual = True
		$szName = $objItem.InstanceName
		$nResult = $objItem.frequency
		If $szName = "Processor_Number_0" Then GUICtrlSetData($whProc0Freq, StringFormat("%i MHz", $nResult))
		If $szName = "Processor_Number_1" Then 
			GUICtrlSetData($whProc1Freq, StringFormat("%i MHz", $nResult))
			GUICtrlSetState($whLblC1, $GUI_ENABLE)		; enable gui items - if found.
			GUICtrlSetState($whCore1, $GUI_ENABLE)	
			GUICtrlSetState($whProc1Freq, $GUI_ENABLE)
			GUICtrlSetState($whProgressCPU1, $GUI_ENABLE)
		EndIf
	Next
EndIf   
; otherwise 'ELSE' go ahead:
If $lbDual = False Then
	If $Testmode Then MsgBox(64,"Debug", "try single core CPU ... ")
	$objWMIService=ObjGet("winmgmts:\\" &$strComputer &"\root\CIMV2")
	If @error Then Return False
	; read the prcessor data from CIMV2 - maybee if single core CPU is found:
	$objColItems=$objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL") 
	If IsObj($objColItems) Then  ; show these values.
	; this example is best for a single core CPU :-)
		For $objItem In $objColItems
			If $Testmode Then MsgBox(64,"Debug", "CurrentClockSpeed = " & $objItem.CurrentClockSpeed)
			$szName = $objItem.DeviceID
			$nResult = $objItem.CurrentClockSpeed
			GUICtrlSetData($whProc0Freq, StringFormat("%i MHz", $nResult))
			If $objItem.NumberOfCores > 1 Then
				GUICtrlSetData($whProc1Freq, StringFormat("%i MHz", $nResult))
				GUICtrlSetState($whLblC1, $GUI_ENABLE)		; enable gui items - if found.
				GUICtrlSetState($whCore1, $GUI_ENABLE)	
				GUICtrlSetState($whProc1Freq, $GUI_ENABLE)
				GUICtrlSetState($whProgressCPU1, $GUI_ENABLE)
			EndIf
		Next
		Return True
	EndIf
EndIf
EndFunc

Func do_get_SMIBios_data()

Local $objColItems, $objWMIService, $strComputer = "localhost", $lnStructPt, $lszString, $lnx, $lnStructLen, $laTemp[128]
Local $lnHerst, $lnBoard, $lnStringCnt, $lnSMIStruct, $lnProc, $lnVMajor, $lnVMinor

$objWMIService=ObjGet("winmgmts:\\" &$strComputer &"\root\WMI")
If @error Then Return False

$objColItems=$objWMIService.ExecQuery("select * from MSSmBios_RawSMBiosTables", "WQL") 
If Not IsObj($objColItems) Then   Return False

For $objItem In $objColItems
	$lszString = $objItem.InstanceName
	$lnVMajor = $objItem.SmbiosMajorVersion
	$lnVMinor = $objItem.SmbiosMinorVersion
	If $objItem.Size > 8190 Then ExitLoop      ; break if size greather Array ... sorry.
	$nSMBiosPuffer = $objItem.SMBiosData
	If $Testmode Then _ArrayDisplay( $nSMBiosPuffer, $lszString)
	$lszString = ""   ; clear the string.
	$lnStructPt = 0 ; start at type.
	$lnStructLen = $nSMBiosPuffer[1]        ; first SMBIOS Structure begns at '0', next byte = length, strings are behind this structure and not calculated in length!
	If $Testmode Then MsgBox(16, "Test", StringFormat("Structure Type: %i - Length: %i", $nSMBiosPuffer[0], $nSMBiosPuffer[1]))
	While $lnStructPt < 8191    ; loop over all structures in SMBiosPuffer
		$lnStructLen = $nSMBiosPuffer[$lnStructPt +1] 	; get length of current structure, Byte 1
		$lnSMIStruct = $nSMBiosPuffer[$lnStructPt]  	; remember current structure type number out of Byte 0.
		If $Testmode Then           	; do some things to show us the SMIBios structs
			MsgBox(16, "Test", StringFormat("Structure Type: %i - Length: %i \nArrayPointer: %i", $nSMBiosPuffer[$lnStructPt], $lnStructLen, $lnStructPt))
			For $i = 1 to 10				; make 10 dummy items
			_ArrayPush( $laTemp, 255, 1)      ; dummy value for better reading - shown at end of current struct values.
			Next
			For $i = $lnStructLen -1 To 0 Step -1    ; copy Structure from SMBIOS into temp Array for ArrayDisplay
				_ArrayPush( $laTemp, $nSMBiosPuffer[$lnStructPt + $i], 1 )    ; copy byte from left to right.
			Next
			_ArrayDisplay($laTemp)			; enjoy this.
		EndIf
		If $nSMBiosPuffer[$lnStructPt] = 28 Then   	; Temperature Probe found.
			If $Testmode Then MsgBox(16,"Test", "Structure Type = " & $nSMBiosPuffer[$lnStructPt])
			If BitAND( $nSMBiosPuffer[$lnStructPt +5 ] , 0x1f) = 0x03  Then     ; should be processor Temp.
				GUICtrlSetState($whCPUTemp, $GUI_DISABLE) 						; set enable if temp is found.
				GUICtrlSetData($whCPUTemp, String( $nSMBiosPuffer[$lnStructPt +5 ] / 10 ))
			EndIf
		EndIf
		If $nSMBiosPuffer[$lnStructPt] = 2 Then    ; Board-Info found. Structure types declared in SMI Bios Specification!
			$lnHerst = $nSMBiosPuffer[$lnStructPt +4]   ; get Number of String!
			$lnBoard = $nSMBiosPuffer[$lnStructPt +5]   ; get Number of String!
			If $Testmode Then MsgBox(16,"Test", StringFormat("SMIBios Struct 2 found, Vendor-String: %i Board-String: %i", $lnHerst, $lnBoard))
		EndIf
		If $nSMBiosPuffer[$lnStructPt] = 4 Then    ; Processor-Info found.
			$lnHerst = $nSMBiosPuffer[$lnStructPt +7]   ; get Number of String!
			$lnProc = $nSMBiosPuffer[$lnStructPt +16] 
;			MsgBox(16,"Test", "Struct 4 - found String No. " & $lnHerst)
		EndIf
		$lnStructPt += $lnStructLen      ; add struct lenght. --> points to strings behind current structure.
		$lnStringCnt = 0     ; count found strings
		while True    ; do a loop over the string section in SMBios - a empty strings shows the end of string section.
			$lszString = do_return_string($lnStructPt)		; get the next string until zero terminated.
			$lnx = StringLen( $lszString)
			If $lnx = 0 Then ExitLoop     ; end of string section.
			$lnStringCnt += 1         	  ; count up.
			If $Testmode Then MsgBox(16, "Test", StringFormat("String %i: %s", $lnStringCnt, $lszString))
			If $lnStringCnt = $lnHerst And $lnSMIStruct = 2 Then $szHerst = $lszString    ; a required string found.
			If $lnStringCnt = $lnBoard And $lnSMIStruct = 2 Then $szBoard = $lszString    ; a rquired string found.
			If $lnStringCnt = $lnHerst And $lnSMIStruct = 4 Then $szProcMan = $lszString
			If $lnStringCnt = $lnProc And $lnSMIStruct = 4 Then $szProcName = $lszString
			$lnStructPt += $lnx	+1		; add stringlength to start-point of string - is a string following? String-End is a Zero-Byte, which is to be count.
		WEnd
		; go forward to next struct. No 0-Type structures behind the first struct shall be found ...
		While $nSMBiosPuffer[$lnStructPt] = 0  ; skip over 0.
			$lnStructPt += 1      
		WEnd               ; now we point in $lnStructPt to next structure, Header[0] = Type.
		If $nSMBiosPuffer[$lnStructPt] = 127 Then ExitLoop     	; break at End.
	WEnd    ; loop trough all structures.
Next		; loop over objItems
; make Version string
$szSMBiosVersion = StringFormat("SMBios %i.%i ", Dec( $lnVMajor ), Dec($lnVMinor))
GUICtrlSetData($whLbSMIVers, $szSMBiosVersion)  ; show SMBios Release
GUICtrlSetData($whLbManf, $szHerst)				; show Manufactorer string
GUICtrlSetData($whLbCPU, $szProcName)			; show Processor string.
; GUICtrlSetData($whStatusBar, StringFormat("%s %s - Board: %s CPU: %s %s", $szSMBiosVersion, $szHerst, $szBoard, $szProcMan, $szProcName))
EndFunc		; all done ?

Func do_return_string( $nStart )
Local $lnx, $lszTmp
$lnx = $nStart
If $nStart > 8190 Then Return ""
while True
		If $nSMBiosPuffer[$lnx] < 20  Then ExitLoop    ; non Char
		$lszTmp &= Chr( $nSMBiosPuffer[$lnx] )
		$lnx += 1
	WEnd
If $lnx = $nStart Then Return ""        ; there was not a string found!
Return $lszTmp							; return the string.
EndFunc

Func do_determine_nic( $init )
Local $objColItems, $objWMIService, $strComputer = "localhost", $szName

$objWMIService=ObjGet("winmgmts:\\" &$strComputer &"\root\CIMV2")
If @error Then Return False
GUICtrlSetData($whCbNICName, "")     ; delete Combo items.
; get all network interface names from wmi and append to combo box:
$objColItems=$objWMIService.ExecQuery("select * from Win32_PerfRawData_Tcpip_NetworkInterface", "WQL") 
If Not IsObj($objColItems) Then   Return False
For $objItem In $objColItems
	$szName = $objItem.Name
	GUICtrlSetData($whCbNICName, $szName & "|" )
Next
If $init Then MsgBox(64, "Information", "Please select the network interface name in combo box ""Network"".") ; show only on first run.
EndFunc

Func do_set_nic_name()
; called by selecting a network in combobox
Local $szStr

$szStr = GUICtrlRead( $whCbNICName )    ; get the value from combo and write into Registry.
If StringLen($szStr) > 0 Then RegWrite($ApplicationRegName, $WinRegKey4NIC, "REG_SZ", $szStr)
Return
EndFunc

Func do_break_event()
; save the window-pos in Registry:
$nWinPos = WinGetPos( $whMain ) ; identify the window via window handle - it works fine but is not documented.
If $nWinPos = 0 Then 			; not found?
	MsgBox(16,"Error", "WinGetPos() Error")    
	Return				; 
EndIf
If $nWinPos[0] < 0 Then $nWinPos[0] = 0
If $nWinPos[1] < 0 Then $nWinPos[1] = 0
If $Testmode Then MsgBox(64, "Window Pos: ", "X, Y : " & $nWinPos[0] & ",  " & $nWinPos[1] )
RegWrite($ApplicationRegName, "WindowPosX", "REG_DWORD", $nWinPos[0]  )
RegWrite($ApplicationRegName, "WindowPosY", "REG_DWORD", $nWinPos[1]  )

Exit
EndFunc

; Func OnAutoItExit()
; do not save the window-pos here - because the window isn't existing at this time.
; EndFunc
