#NoTrayIcon
; by Ritzelrocker04, Xenobiologist and Oscar
Opt('MustDeclareVars', 1)
;[Includes]
#include<Array.au3>
#include<GUIConstants.au3>
#include<String.au3>

#cs
$reshacker = FileOpenDialog("Resource-Hacker suchen",@ScriptDir,"reshacker.exe")
$Temp = FileRead("D:\Dokumente\Dateien von Andreas\Downloads\Resource Hacker\d.txt")
$delete = @CRLF & '	<!-- Identify the application dependencies. -->' & @CRLF _
&@TAB & '<dependency>' & @CRLF _
&@TAB & @TAB & '<dependentAssembly>' & @CRLF _
&@TAB & @TAB & @TAB & '<assemblyIdentity' & @CRLF _
&@TAB & @TAB & @TAB & @TAB & 'type="win32"' & @CRLF _
&@TAB & @TAB & @TAB & @TAB & 'name="Microsoft.Windows.Common-Controls"' & @CRLF _
&@TAB & @TAB & @TAB & @TAB & 'version="6.0.0.0"' & @CRLF _
&@TAB & @TAB & @TAB & @TAB & 'language="*"' & @CRLF _
&@TAB & @TAB & @TAB & @TAB & 'processorArchitecture="*"' & @CRLF _
&@TAB & @TAB & @TAB & @TAB & 'publicKeyToken="6595b64144ccf1df"' & @CRLF _
&@TAB & @TAB & @TAB & '/>' & @CRLF _
&@TAB & @TAB & '</dependentAssembly>' & @CRLF _
&@TAB & '</dependency>' & @CRLF
$Temp = StringReplace($Temp,$delete,"")
MsgBox(0,"",@error)
$file = FileOpen("D:\Dokumente\Dateien von Andreas\Downloads\Resource Hacker\d.txt",2)
FileWrite($file,$Temp)
FileClose($file)
Exit
#ce

If Not IsDeclared("Range") Then Const $Range = 100
If Not IsDeclared("WM_MOVING") Then Const $WM_MOVING = 0x0216
If Not IsDeclared("WM_ENTERSIZEMOVE") Then Const $WM_ENTERSIZEMOVE = 0x0231
If Not IsDeclared("WM_LBUTTONDOWN") Then Global Const $WM_LBUTTONDOWN = 0x0201
If Not IsDeclared("WM_SYSCOMMAND") Then Const $WM_SYSCOMMAND = 0x112
If Not IsDeclared("WM_RBUTTONDOWN") Then Global Const $WM_RBUTTONDOWN = 0x0204

Global $taskbarPos = WinGetPos("[CLASS:Shell_TrayWnd]"), $x_start, $y_start

Global $iPosY = IniRead(@ScriptDir & '\SpaceBar.ini', 'Pos', 'iPosY', 27)
Global $bHide = IniRead(@ScriptDir & '\SpaceBar.ini', 'Pos', 'bHide', 1)
Global $hidden = $bHide
Global $cGUIColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cGUIColor', 0x444444)
Global $cBarColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cBarColor', 0xBBBBBB)
Global $cGBColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cGBColor', 0xBBBBBB)
Global $cTextColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cTextColor', 0xBBBBBB)
Global $cTextBGColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cTextBGColor', 0x666666)
Global $cWarnColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cWarnColor', 0xDD0000)
Global $cAttentionColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cAttentionColor', 0xEE8800)
Global $cOKColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cOKColor', 0x00CC00)
Global $cCloseBGColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cCloseBGColor', 0xDD0000)
Global $cCloseXColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cCloseXColor', 0xFFFFFF)
Global $cProgressFrontColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cProgressFrontColor', 0xAAAA00)
Global $cProgressFrontGradColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cProgressFrontGradColor', 0xFF0000)
Global $cProgressBGColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cProgressBGColor', 0x00CC00)
Global $cProgressBGEndColor = IniRead(@ScriptDir & '\SpaceBar.ini', 'Color', 'cProgressBGEndColor', 0x00FF00)

Global $aFDrive = DriveGetDrive('FIXED'), $aNDrive = DriveGetDrive('NETWORK')
If IsArray($aNDrive) Then
    For $i = 1 To $aNDrive[0]
        _ArrayAdd($aFDrive, $aNDrive[$i])
        $aFDrive[0] += 1
    Next
EndIf

Global $aProgress[$aFDrive[0]], $aName[$aFDrive[0]], $msg = 0, $aVol = 0, $aProzent[$aFDrive[0]], $aGB[$aFDrive[0]]
Global $aZwischenspeicher[$aFDrive[0]]
Global $GUI = GUICreate('SpaceBar v 2.0', 340, 8 + $aFDrive[0] * 50, @DesktopWidth - 340, $iPosY, $WS_POPUP+$WS_BORDER, $WS_EX_TOPMOST)
GUISetBKColor($cGUIColor); Hintergrundfarbe des Fensters

Global $Colors = _Gradient($cProgressBGColor,$cProgressBGEndColor, $aFDrive[0]*2)
Global $hider = GUICtrlCreateLabel(_StringRepeat(":: ", $aFDrive[0] * 4),0,0,6,10 + $aFDrive[0] * 50)
GUICtrlSetBkColor(-1, $cBarColor); Hintergrundfarbe der Seiten-Leiste
Dim $k = 0
For $i = 0 To $aFDrive[0] - 1
    $aProgress[$i] = _ProgressCreate(10, 8 + $i * 50, 230, 20,$cProgressFrontColor,$cProgressFrontGradColor,$Colors[$k],$Colors[$k+1])
	$aProzent[$i] = GUICtrlCreateLabel("", 250, 8 + $i * 50,70,20,$ES_RIGHT,$GUI_WS_EX_PARENTDRAG)
		GUICtrlSetFont(-1,10,700,0,"Arial")
	$aGB[$i] = GUICtrlCreateLabel("", 250, 30 + $i * 50,70,20,$ES_RIGHT,$GUI_WS_EX_PARENTDRAG)
		GUICtrlSetColor(-1, $cGBColor); Farbe der GB-Zahl
		GUICtrlSetFont(-1,10,500,0,"Arial")
	$k+=2
	;Func _ProgressCreate($x, $y,$w = 204, $h = 24,$Col=0xFFFF00,$BG=0xAAAA00,$GradCol=0x00FF00,$GradBG=0xFF0000)
    $aName[$i] = GUICtrlCreateInput('', 10, 30 + $i * 50, 230, 21, $ES_READONLY)
		GUICtrlSetColor(-1, $cTextColor); Farbe der Beschriftung unter der Progressbar
		GUICtrlSetBKColor(-1, $cTextBGColor); Farbe des Hintergrunds der Beschriftung unter der Progressbar
Next
Dim $aContext = GUICtrlCreateLabel("  ",250,10,230,-2 + $aFDrive[0] * 50,-1,$GUI_WS_EX_PARENTDRAG)	;Label for ContextMenu over the otherLabels
	GUICtrlSetState($aContext,$GUI_ONTOP)
	GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
	Global $trackmenu = GUICtrlCreateContextMenu($aContext)
		Global $aboutitem = GUICtrlCreateMenuItem('About', $trackmenu)
		Global $hideitem = GUICtrlCreateMenuItem('Hide on Start', $trackmenu, 3)
			If $bHide = 1 Then GUICtrlSetState($hideitem, $GUI_CHECKED)
		GUICtrlCreateMenuItem('', $trackmenu)
		Global $exititem = GUICtrlCreateMenuItem('Exit', $trackmenu)
Dim $aExit = GUICtrlCreateLabel("X",329,0,11,11,$ES_CENTER) ; Label als Exit-Button
	GUICtrlSetBkColor(-1,$cCloseBGColor)
	GUICtrlSetColor(-1,$cCloseXColor)
	GUICtrlSetFont(-1,-1,600)
GUIRegisterMsg($WM_RBUTTONDOWN, "_RightClick")	; Funktion, um das KontextMenu des Labels auch von der Gui aus aufzurufen
GUIRegisterMsg($WM_LBUTTONDOWN, "_WinMove")	; Funktion, um das Fenster zu bewegen
GUIRegisterMsg($WM_ENTERSIZEMOVE, "On_WM_ENTERSIZEMOVE") ; Docking
GUIRegisterMsg($WM_MOVING, "On_WM_MOVING")	; Docking
If $bHide Then WinMove($GUI,"",@DesktopWidth-8,Default)
GUISetState()

_Update()

AdlibEnable('_Update', 4000) ; Empfehlung AdlibEnable('_Update', 300000) = 5min
While 1
    $msg = GUIGetMsg()
	Select
    Case $msg = $exititem Or $msg = -3 Or $msg = -1 Or $msg = $aExit
		Dim $aPos = WinGetPos($GUI)
		IniWrite(@ScriptDir & '\SpaceBar.ini', 'Pos', 'iPosY', $aPos[1])
        Exit
	Case $msg = $hider
		If $hidden Then 
			WinMove($gui,"",@DesktopWidth-340,Default)
		Else
			WinMove($gui,"",@DesktopWidth-7,Default)
		EndIf
		$hidden = Not $hidden
	Case $msg = $hideitem
		If $bHide = 1 Then
			GUICtrlSetState($hideitem, $GUI_UNCHECKED)
			$bHide = 0
		Else
			GUICtrlSetState($hideitem, $GUI_CHECKED)
			$bHide = 1
		EndIf
	EndSelect
    If $msg = $aboutitem Then MsgBox(64, 'About', 'SpaceBar v 2.0.0.0 Build 2007-12-23 ' & @CRLF & '' & @CRLF & 'Copyright by :' & @CRLF & 'Ritzelrocker04, Oscar, Xenobiologist ' & @CRLF & 'Thx an das www.Autoit.de Team ')
WEnd
	

Func _Update()
    For $i = 0 To $aFDrive[0] - 1
        $aVol = _DriveFree($aFDrive[$i + 1])
		If $aZwischenspeicher[$i] = $aVol[2] Then ContinueLoop
		$aZwischenspeicher[$i] = $aVol[2]
        ;_GuiCtrlOCXProgressSetValue($aProgress[$i], $aVol[0])
		GUICtrlSetData($aProzent[$i],StringReplace((100-$aVol[0]),".",",") & "% frei")
		If $aVol[3]/1024 < 20.9 Then 
		Select
			Case $aVol[0] >= 60
				GUICtrlSetColor($aProzent[$i],$cWarnColor)
			Case $aVol[0] < 60 And $aVol[0] > 40
				GUICtrlSetColor($aProzent[$i],$cAttentionColor)
			Case $aVol[0] <= 40
				GUICtrlSetColor($aProzent[$i],$cOKColor)
		EndSelect
		Else
		Select
			Case Round(Number($aVol[2])/1024) < 5
				GUICtrlSetColor($aProzent[$i],$cWarnColor)
			Case Round(Number($aVol[2])/1024) <= 10
				GUICtrlSetColor($aProzent[$i],$cAttentionColor)
			Case Else
				GUICtrlSetColor($aProzent[$i],$cOKColor)
		EndSelect
		EndIf
		GUICtrlSetData($aGB[$i],"von " & StringReplace(Round(($aVol[3]/1024),1),".",",") & "GB")
		;_ProgressSet($aProgress[$i], 100-Number($aVol[0]))  	;100% = alles frei
		_ProgressSet($aProgress[$i], Number($aVol[0]))  	;100% = alles voll
		;If @error Then MsgBox(0, $aVol[0], @error)
        GUICtrlSetData($aName[$i], 'Auf ' & $aVol[1] & ' sind ' & _StringAddComma(StringReplace($aVol[2],".",","),".",",") & ' MB frei')
		
    Next
EndFunc   ;==>_Update

Func _DriveFree($LW)
    Local $TOTAL = DriveSpaceTotal($LW), $FREE = DriveSpaceFree($LW), $aDrive[4] = [(Round(($TOTAL - $FREE) / ($TOTAL / 100), 2)), _
            StringUpper($LW) & ' (' & DriveGetLabel($LW) & ')', Round($FREE, 2), $TOTAL]
    Return $aDrive
EndFunc   ;==>_DriveFree

;-------------------------------------------------------------------
#region Moving and Docking
Func _WinMove($HWnd, $Command, $wParam, $lParam)
    If BitAND(WinGetState($HWnd), 32) Then Return $GUI_RUNDEFMSG
    DllCall("user32.dll", "long", "SendMessage", "hwnd", $HWnd, "int", $WM_SYSCOMMAND, "int", 0xF009, "int", 0)
EndFunc   ;==>_WinMove

; Author: Xenobiologist (Mega)
Func On_WM_ENTERSIZEMOVE()
    Local $aMPos = MouseGetPos()
    $x_start = $aMPos[0]
    $y_start = $aMPos[1]
EndFunc   ;==>On_WM_ENTERSIZEMOVE

; Author: Xenobiologist (Mega)
Func On_WM_MOVING($hWnd, $Msg, $wParam, $lParam)
    Local $aMPos = MouseGetPos()
    Local $rect = DllStructCreate("long left; long top; long right; long bottom", $lParam)
    Local $left = DllStructGetData($rect, "left")
    Local $top = DllStructGetData($rect, "top")
    Local $right = DllStructGetData($rect, "right")
    Local $bottom = DllStructGetData($rect, "bottom")
    If $left <= $Range And $aMPos[0] < $x_start Then
        DllStructSetData($rect, "left", 0)
        DllStructSetData($rect, "right", $right - $left)
    EndIf
    If $top <= $Range And $aMPos[1] < $y_start Then
        DllStructSetData($rect, "top", 0)
        DllStructSetData($rect, "bottom", $bottom - $top)
    EndIf
    If $right >= (@DesktopWidth - $Range) And $aMPos[0] > $x_start Then
        DllStructSetData($rect, "right", @DesktopWidth)
        DllStructSetData($rect, "left", (@DesktopWidth - $right) + $left)
    EndIf
    If $bottom >= ($taskbarPos[1] - $Range) And $aMPos[1] > $y_start Then
        DllStructSetData($rect, "bottom", $taskbarPos[1])
        DllStructSetData($rect, "top", ($taskbarPos[1] - $bottom) + $top)
    EndIf
    On_WM_ENTERSIZEMOVE()
EndFunc   ;==>On_WM_MOVING
#endregion
;-------------------------------------------------------------------

;-------------------------------------------------------------------
#region Gradient
;===============================================================================
;
; Function Name:   _Gradient($RGB_Color1 ,$RGB_Color2, $Count)
; Description::    Returns an Array of Gradient Colors
; Parameter(s):    $RGB_Color1 : The Start-Color in RGB Hexadecimal
;                  $RGB_Color2 : The End-Color in RGB Hexadecimal
;                  $Count :      The number of Colors in the Gradient
; Requirement(s):  
; Return Value(s): An Array with the Colors
; Author(s):       Prog@ndy
;
;===============================================================================
;

Func _Gradient($RGB_Color1 ,$RGB_Color2, $Count)
	Dim $Color1_R, $Color1_G, $Color1_B, $Color2_R, $Color2_G, $Color2_B, $NeuCol_R, $NeuCol_G, $NeuCol_B
	
	$Color1_R = BitAND( BitShift($RGB_Color1, 16), 0xff)
	$Color1_G = BitAND( BitShift($RGB_Color1, 8), 0xff)
	$Color1_B = BitAND($RGB_Color1, 0xff)
	
	$Color2_R = BitAND( BitShift($RGB_Color2, 16), 0xff)
	$Color2_G = BitAND( BitShift($RGB_Color2, 8), 0xff)
	$Color2_B = BitAND($RGB_Color2, 0xff)
	
	$Count -= 1 ; 0-basiert !
	Dim $arColors[$Count+1], $pos1
	
	For $i = 0 To $Count
		$pos1 = $Count - $i
		$NeuCol_R = ($Color1_R * $pos1 + $Color2_R * $i) / ($Count)
		$NeuCol_G = ($Color1_G * $pos1 + $Color2_G * $i) / ($Count)
		$NeuCol_B = ($Color1_B * $pos1 + $Color2_B * $i) / ($Count)
		$arColors[$i] = Execute("0x" & Hex($NeuCol_R,2) & Hex($NeuCol_G,2) & Hex($NeuCol_B,2))
	Next
	Return $arColors
EndFunc
#endregion
;-------------------------------------------------------------------

;-------------------------------------------------------------------
#region Colored Progressbar

;Hilfsfunktion für doppelten Verlauf
; Author(s):       Prog@ndy
Func _ZwischenGrad($RGB_c)
	Local $c_R = BitAND( BitShift($RGB_c, 16), 0xff)
	Local $c_G = BitAND( BitShift($RGB_c, 8), 0xff)
	Local $c_B = BitAND($RGB_c, 0xff)
	$c_R  = _MyMax(0,$c_R-99)
	$c_G  = _MyMax(0,$c_G-99)
	$c_B  = _MyMax(0,$c_B-99)
	Return Dec(Hex($c_R,2) & Hex($c_G,2) & Hex($c_B,2))
EndFunc

; Author(s):       Prog@ndy
Func _ProgressCreate($x, $y,$w = 204, $h = 24,$Col=0xFFFF00,$GradCol=0x00FF00,$BG=0xAAAA00,$GradBG=0xFF0000)
	Local $ID[8]
	$ID[0] = GUICtrlCreateGraphic($x,$y,$w,$h)
	Local $error = @error
	Local $extended = @extended
	$ID[1] = $w
	$ID[2] = $h
	If $Col = -1 Then $Col=0xFFFF00
	If $BG = -1 Then $BG=0xAAAA00
	If $GradCol = -1 Then $GradCol=0x00FF00
	If $GradBG = -1 Then $GradBG=0xFF0000
	$ID[3] = $Col
	$ID[4] = $BG
	$ID[5] = $GradCol
	$ID[6] = $GradBG
	_ProgressSet($ID,0)
	Return SetError($error,$extended,$ID)
EndFunc

; Author(s):       Prog@ndy
Func _ProgressDelete(ByRef $ID)
	If Not IsArray($ID) Or UBound($ID) <> 8 Then Return SetError(1,0,0)
	$ID[1] = -1
	$ID[2] = -1
	$ID[3] = -1
	$ID[4] = -1
	$ID[5] = -1
	$ID[6] = -1
	$ID[7] = -1
	Dim $temp = GUICtrlDelete($ID[0])
	Return SetError(@error,0,$temp)
EndFunc

; Author(s):       Prog@ndy
Func _ProgressSetColors(ByRef $ID,$Col,$BG=-1,$GradCol=-1,$GradBG=-1)
	If Not IsArray($ID) Or UBound($ID) <> 8 Then Return SetError(1,0,0)
	$ID[3] = $Col
	If $BG <> -1 Then  $ID[4] = $BG
	If $GradCol <> -1 Then $ID[5] = $GradCol
	If $GradBG <> -1 Then $ID[6] = $GradBG
	_ProgressSet($ID,$ID[7])
	Return SetError(@error,0,@error)
EndFunc

; Author(s):       Prog@ndy
Func _ProgressSet(ByRef $ID, $value)
	Local $Wechsel = Round((9/20)*$ID[2]-4)
	Local $Hoehe = $ID[2]-4
	Local $Breite = $ID[1]-4
	

	
	If $value <= $ID[7] Then
		GUICtrlSetBkColor($ID[0],0xAAAAAA)
		GUICtrlSetColor($ID[0],0x777777)
		$ID[7] = $value
		Local $temp = _ZwischenGrad($ID[6])
		Local $Gradient = _Gradient($ID[4],$temp, $Wechsel)
		Local $Gradient2 = _Gradient($temp,$ID[6], $Hoehe-$Wechsel)
		For $i = 2 To $Wechsel+1
			GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,$Gradient[$i-2])
			GUICtrlSetGraphic($ID[0],$GUI_GR_RECT, 2,$i,$Breite,1)
		Next
		For $i = $Wechsel+2 To $Hoehe+1
			GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,$Gradient2[$i-$Wechsel-2])
			GUICtrlSetGraphic($ID[0],$GUI_GR_RECT, 2,$i,$Breite,1)
		Next
		Local $start = 2
	Else
		Local $start = $ID[7]+2
		$ID[7] = $value
	EndIf

	Local $Faktor = $Breite/100
	$value *= $Faktor
	If Round($value) >= $Breite Then $value = $Breite
	Local  $temp = _ZwischenGrad($ID[5])
	Local $Gradient = _Gradient($ID[3],$temp, $Wechsel)
	Local $Gradient2 = _Gradient($temp,$ID[5], $Hoehe-$Wechsel)
	;Local $Gradient = _Gradient(0xFFFF00,0x00AA00, $Wechsel)
	;Local $Gradient2 = _Gradient(0x00AA00,0x00FF00, $Hoehe-$Wechsel)
	For $i = 2 To $Wechsel+1
		GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,$Gradient[$i-2])
		GUICtrlSetGraphic($ID[0],$GUI_GR_RECT, $start,$i,$value-$start+2,1)
	Next
	For $i = $Wechsel+2 To $Hoehe+1
		GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,$Gradient2[$i-$Wechsel-2])
		GUICtrlSetGraphic($ID[0],$GUI_GR_RECT, $start,$i,$value-$start+2,1)
	Next
	
	GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,0xCCCCCC)
	GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, 2,2)
	GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, 2,$Hoehe+1);19)
	GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, $Breite+1,2)
	GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, $Breite+1,$Hoehe+1)
	GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,0xEEEEEE)
	GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, 0,$Hoehe+3)
	GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, 0,0)
	GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, $Breite+3,$Hoehe+3)
	GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, $Breite+3,0)

	GUICtrlSetGraphic($ID[0],$GUI_GR_REFRESH)
	
EndFunc

; Original _Max() Function, directly included
; Author(s):       Jeremy Landes <jlandes at landeserve dot com>
Func _MyMax($nNum1, $nNum2)
	; Check to see if the parameters are indeed numbers of some sort.
	If (Not IsNumber($nNum1)) Then
		SetError(1)
		Return (0)
	EndIf
	If (Not IsNumber($nNum2)) Then
		SetError(2)
		Return (0)
	EndIf
	
	If $nNum1 > $nNum2 Then
		Return $nNum1
	Else
		Return $nNum2
	EndIf
EndFunc   ;==>_Max

#endregion
;-------------------------------------------------------------------

;-------------------------------------------------------------------
#region Context Menu Handlers
Func _RightClick($HWnd, $Command, $wParam, $lParam)
	ShowMenu($hWnd,$trackmenu,$aContext,1)
EndFunc


;Author: MsCreatoR in http://www.autoitscript.com/forum/index.php?s=&showtopic=60192&view=findpost&p=453350
;Modified from Help
; Show a menu in a given GUI window which belongs to a given GUI ctrl
Func ShowMenu($hWnd, $nContextID, $nContextControlID, $iMouse=0)
    Local $hMenu = GUICtrlGetHandle($nContextID)
    Local $iCtrlPos = ControlGetPos($hWnd, "", $nContextControlID)
   
    Local $X = $iCtrlPos[0]
    Local $Y = $iCtrlPos[1] + $iCtrlPos[3]
   
    ClientToScreen($hWnd, $X, $Y)
   
    If $iMouse Then
        $X = MouseGetPos(0)
        $Y = MouseGetPos(1)
    EndIf
   
    DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $X, "int", $Y, "hwnd", $hWnd, "ptr", 0)
EndFunc

; Convert the client (GUI) coordinates to screen (desktop) coordinates
;From Help
Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
    Local $stPoint = DllStructCreate("int;int")
   
    DllStructSetData($stPoint, 1, $x)
    DllStructSetData($stPoint, 2, $y)

    DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))
   
    $x = DllStructGetData($stPoint, 1)
    $y = DllStructGetData($stPoint, 2)
    ; release Struct not really needed as it is a local
    $stPoint = 0
EndFunc	
#endregion
;-------------------------------------------------------------------