;Electronic Program guide ;by toralf ;requires AHK 1.0.44.09 ;www.autohotkey.com/forum/topic7839.html Gui1Title = EPG v1.3 /* 1st beta: initial release 2nd beta: - removed button to show program - improved/unified time presentation - improved sorting for start/end time 3rd beta - fixed: inability to change programs when selecting date - fixed: improved/unified time presentation for US - improved/unified date presentation 4th beta - add: filter for time periods - add: details in edit field (only Germany/France) 5th beta - fixed: US TV-Stations without Info - fixed: "&" in Station name - add: details for US stations (details don't work for Italy and UK) 6th beta - add: export program list to file 7th beat - add: replace special html characters in details into regular characters 8th beta - improved: replace more special html characters in details 9th beta - fixed memory problem - add: remove java script from details v1 - fixed HTML Special Char replacement for "&" - add: replace HTML Special Chars in program name v1.1 (thanks Titan and Micha) - Gui can be resized - A single click on program shows details - Only a single program can be selected in list - Gui remembers position - Gui remembers location - dates are shown in locale format v1.2 - Change of text labels (thx Titan) - add: statusbar, icon and tray menu - add: tip in statusbar - improved: details for Italy and UK v1.3 - Added detection of summer time period for europe (fixes bug reported by MisterX) Still Needed: - support for command line parameters */ #SingleInstance force ;create traybar menu IconFile = %A_WinDir%\system32\wmploc.dll IfExist, %IconFile% Menu, Tray, Icon, %IconFile%, 8 ;icon for taskbar and for proces in task manager Menu, Tray, NoStandard Menu, Tray, Tip, %Gui1Title% Menu, Tray, Add, Open, ActivateGui Menu, Tray, Default, Open Menu, Tray, Add, Exit, GuiClose Menu, Tray, Click, 1 RootURL = (LTrim Join| http://de.tv.yahoo.com http://fr.tv.yahoo.com http://it.tv.yahoo.com http://uk.tv.yahoo.com http://tv.yahoo.com http://tv.yahoo.com http://tv.yahoo.com http://tv.yahoo.com http://tv.yahoo.com http://tv.yahoo.com ) URLTVOverView = (LTrim Join| /grid?lineup=de&.intl=de&startdate=$DateInSeconds$&starthour=72000 /grid?lineup=fr&.intl=fr&startdate=$DateInSeconds$&starthour=72000 /grid?lineup=it&.intl=it&startdate=$DateInSeconds$&starthour=72000 /grid?lineup=uk&.intl=uk&startdate=$DateInSeconds$&starthour=72000 /grid/?prt=&lineup=us_Eastern&dur=3&.intl=us&startdate=$DateInSeconds$&starthour=15 /grid/?prt=&lineup=us_Central&dur=3&.intl=us&startdate=$DateInSeconds$&starthour=14 /grid/?prt=&lineup=us_Mountain&dur=3&.intl=us&startdate=$DateInSeconds$&starthour=13 /grid/?prt=&lineup=us_Pacific&dur=3&.intl=us&startdate=$DateInSeconds$&starthour=12 /grid/?prt=&lineup=us_Alaskan&dur=3&.intl=us&startdate=$DateInSeconds$&starthour=11 /grid/?prt=&lineup=us_Hawaiian&dur=3&.intl=us&startdate=$DateInSeconds$&starthour=10 ) StringSplit, RootURL, RootURL, | StringSplit, URLTVOverView, URLTVOverView, | LocationsWoGermany = France,Italy,UK/Ireland,US-Eastern,US-Central,US-Mountain,US-Pacific,US-Alaska,US-Hawaiian Gui,+Resize Gui, Add, Text, , Region: Gui, Add, Radio, xm Section vTVLocation gTVLocation, Germany Loop, Parse, LocationsWoGermany, `, Gui, Add, Radio, ys gTVLocation, %A_LoopField% Gui, Add, Text, xm, Channels: Gui, Add, ListView, xm r6 w800 -Hdr AltSubmit vLvStations gLvStations Checked, Station|Link Gui, Add, Text, xm Section, Available dates: Gui, Add, ListBox, xm w100 r7 vLstProgramDays gCollectStationsToShow AltSubmit, Gui, Add, Text, xm , Time filter: Gui, Add, ListBox, xm w100 r6 vLstTimePeriods gCollectStationsToShow ,None||Till 08:00|08:00 - 16:00|16:00 - 20:00|20:00 - 00:00|After 00:00 Gui, Add, Button, xm w100 vBtnExportToFile gBtnExportToFile Disabled, Export to file Gui, Add, Text, ys Section, TV programs: Gui, Add, ListView, xs r15 w300 -Multi AltSubmit vLvTVProgram gLvTVProgram, Station|Start|End|Name|Link|SortStartTime|SortEndTime|StationLink Gui, Add, Text, ys , Program information: Gui, Add, Edit, w380 r17 vEdtTVProgramDetails, IniRead, GuiPos1, %A_ScriptName%.ini, Settings, GuiPos1, %A_Space% Gui, Show, %GuiPos1%, %Gui1Title% ;add statusbar to gui BarHWND1 := SB_Segments("30,-1") SB_Text(BarHWND1, 1, "Tip:") ;Enable dynamic statusbar text (e.g. for tips on controls) OnMessage(0x200, "UpdateStatusBarText") ;WM_MOUSEMOVE OnMessage(0x2a2, "UpdateStatusBarText") ;WM_NCMOUSELEAVE SetTimer, CheckIfMouseIsOutsideGui,250 IniRead, TVLocation, %A_ScriptName%.ini, Settings, TVLocation, %A_Space% If (TVLocation = 1){ GuiControl, , TVLocation, 1 GoSub, TVLocation }Else If (TVLocation > 1){ Loop, Parse, LocationsWoGermany, `n { If (TVLocation = A_Index + 1){ GuiControl, , %A_LoopField%, 1 GoSub, TVLocation Break } } } Return ;check if mouse has left the gui, to update the dynamic statusbar text CheckIfMouseIsOutsideGui: MouseGetPos,,,MouseOverWindow, Gui, 1:+Lastfound If (MouseOverWindow <> WinExist()) UpdateStatusBarText("","","0x2a2","") return ;set text in statusbar depending on where the mouse is in the gui UpdateStatusBarText(wParam, lParam, msg, hwnd){ global BarHWND1, LocationsWoGermany If (msg = 0x200){ ;mouse moved in gui If A_GuiControl in TVLocation,%LocationsWoGermany% SB_Text(BarHWND1, 2, "Select region you would like to view TV listings for") Else If A_GuiControl = LvStations SB_Text(BarHWND1, 2, "Check the channels for a list of available programs") Else If A_GuiControl = LvTVProgram SB_Text(BarHWND1, 2, "Select TV program for information") Else If A_GuiControl = BtnExportToFile SB_Text(BarHWND1, 2, "Export list of TV programs to file") Else If A_GuiControl = EdtTVProgramDetails SB_Text(BarHWND1, 2, "Select a program in the list of TV programs to get information") Else SB_Text(BarHWND1, 2, "") }Else If (msg = 0x2a2){ ;mouse leaves gui SB_Text(BarHWND1, 2, "") } } ActivateGui: Gui, +Lastfound WinActivate Return GuiClose: GuiEscape: Gui, Submit, NoHide IniWrite, %TVLocation%, %A_ScriptName%.ini, Settings, TVLocation WinGetPos, PosX, PosY, SizeW, SizeH, %WinNameGui1% IniWrite, x%PosX% y%PosY%, %A_ScriptName%.ini, Settings, GuiPos1 ExitApp Return GuiSize: new_w := A_GuiWidth - 20 GuiControl, 1:Move, LvStations, w%new_w% new_h := A_GuiHeight - 225 GuiControl, 1:Move, LvTVProgram, h%new_h% new_w -= 420 GuiControl, 1:Move, EdtTVProgramDetails, w%new_w% h%new_h% ;adjust statusbar size SendMessage 5,0,0,,ahk_id %BarHWND1% ; 5 = WM_SIZE Return BtnExportToFile: FileSelectFile, SelectedFile, 18, , Select export file, Text file (*.txt) If SelectedFile { FileDelete, %SelectedFile% ExportString = Gui, ListView, LvTVProgram Loop, % LV_GetCount() { LV_GetText(Station, A_Index,1) LV_GetText(StartTime, A_Index,2) LV_GetText(EndTime, A_Index,3) LV_GetText(Name, A_Index,4) ExportString = %ExportString%%Station%|%StartTime%|%EndTime%|%Name%`n } StringTrimRight, ExportString, ExportString, 1 FileAppend, %ExportString%, %SelectedFile% } Return LvTVProgram: If (A_GuiEvent = "ColClick") { If (A_EventInfo = 2){ If SortCol2 LV_ModifyCol(6, "Sort") Else LV_ModifyCol(6, "SortDesc") SortCol2 := not SortCol2 }Else If (A_EventInfo = 3){ If SortCol3 LV_ModifyCol(7, "Sort") Else LV_ModifyCol(7, "SortDesc") SortCol3 := not SortCol3 } }Else If (A_GuiEvent = "Normal"){ LV_GetText(Link, A_EventInfo,5) LV_GetText(StationLink, A_EventInfo,8) GuiControl, ,EdtTVProgramDetails, If Link is not Space { URL := RootURL%TVLocation% . Link URLDownloadToFile, %URL%, TVProgramDetails.txt FileRead, TVProgramDetails, TVProgramDetails.txt FileDelete, TVProgramDetails.txt StringReplace, TVProgramDetails, TVProgramDetails, | ,, All If (TVLocation > 4) { ;it is US StringReplace, TVProgramDetails, TVProgramDetails,
, | StringReplace, TVProgramDetails, TVProgramDetails,
, | StringSplit, TVProgramDetails, TVProgramDetails, | TVProgramDetails := RemoveHTMLTags(TVProgramDetails2) StringReplace, TVProgramDetails, TVProgramDetails, You can record this program to your TiVo., , All StringReplace, TVProgramDetails, TVProgramDetails, Learn more..., , All StringReplace, TVProgramDetails, TVProgramDetails, Add to My Calendar, , All }Else { StringReplace, TVProgramDetails, TVProgramDetails, %StationLink%, | StringReplace, TVProgramDetails, TVProgramDetails, , | StringSplit, TVProgramDetails, TVProgramDetails, | TVProgramDetails := RemoveHTMLTags("<" . TVProgramDetails2) StringReplace, TVProgramDetails, TVProgramDetails, Zu meinem Kalender hinzufü`;gen, , All StringReplace, TVProgramDetails, TVProgramDetails, Ajouter à`; mon Agenda, , All StringReplace, TVProgramDetails, TVProgramDetails, Aggiungi alla mia Agenda">Aggiungi alla mia Agenda, , All ;" StringReplace, TVProgramDetails, TVProgramDetails, Add to My Calendar, , All StringReplace, TVProgramDetails, TVProgramDetails, `:`:BBC 2, , All StringReplace, TVProgramDetails, TVProgramDetails, `:`:ITV 1, , All StringReplace, TVProgramDetails, TVProgramDetails, `:`:Channel 4, , All StringReplace, TVProgramDetails, TVProgramDetails, `:`:Channel 5, , All StringReplace, TVProgramDetails, TVProgramDetails, `:`:Sky One, , All StringReplace, TVProgramDetails, TVProgramDetails, `:`:Film Four, , All StringReplace, TVProgramDetails, TVProgramDetails, `:`:Sky Sports, , All StringReplace, TVProgramDetails, TVProgramDetails, `:`:More channels, , All Loop, 8 { StringReplace, TVProgramDetails, TVProgramDetails, `n`n, `n%A_Space%, All StringReplace, TVProgramDetails, TVProgramDetails, `n `n, `n, All } } StringReplace, TVProgramDetails, TVProgramDetails, `,`n, `,%A_Space% , All StringReplace, TVProgramDetails, TVProgramDetails, :`n, :%A_Space% , All TVProgramDetails := ReplaceHTMLSpecialChars(TVProgramDetails) StringTrimLeft, TVProgramDetails, TVProgramDetails, 1 StringTrimRight, TVProgramDetails, TVProgramDetails, 1 TempString = Loop, Parse, TVProgramDetails, `n { If A_LoopField contains var xmlhttp=false`; Break TempString = %TempString%%A_LoopField%`n } GuiControl, ,EdtTVProgramDetails, %TempString% } } Return ReplaceHTMLSpecialChars(String){ StringReplace, String, String,  `;, %A_Space% , All StringCaseSense, On StringReplace, String, String, Ä`;, Ä , All StringReplace, String, String, Ö`;, Ö , All StringReplace, String, String, Ü`;, Ü , All StringCaseSense, Off StringReplace, String, String, ä`;, ä , All StringReplace, String, String, ö`;, ö , All StringReplace, String, String, ü`;, ü , All StringReplace, String, String, ï`;, ï , All StringReplace, String, String, ë`;, ë , All StringReplace, String, String, ßl`;, ß , All StringReplace, String, String, &`;, & , All StringReplace, String, String, §`;, § , All StringReplace, String, String, ¤`;, ¤ , All StringReplace, String, String, é`;, é , All StringReplace, String, String, â`;, â , All StringReplace, String, String, ç`;, ç , All Return String } LvStations: If A_GuiEvent = I GoSub, CollectStationsToShow Return CollectStationsToShow: Gui, Submit, NoHide ListOfStations = ListOfStationLinks = RowNumber = 0 Gui, ListView, LvStations Loop, % LV_GetCount() { RowNumber := LV_GetNext(RowNumber,"C") If not RowNumber Break LV_GetText(Station, RowNumber,1) LV_GetText(Link, RowNumber,2) ListOfStations = %ListOfStations%%Station%`n ListOfStationLinks = %ListOfStationLinks%%Link%`n } StringTrimRight, ListOfStations, ListOfStations, 1 StringTrimRight, ListOfStationLinks, ListOfStationLinks, 1 If ListOfStations is not space GoSub, FillTVStationProgram Return FillTVStationProgram: DateString := TimeInSecondsProgramDays%LstProgramDays% StringSplit,StationLink, ListOfStationLinks, `n GuiControl, ,EdtTVProgramDetails, GuiControl, Enable ,BtnExportToFile Gui, ListView, LvTVProgram LV_Delete() GuiControl, -Redraw, LvTVProgram Loop, Parse, ListOfStations, `n { Station = %A_LoopField% StationLink := StationLink%A_Index% StationNameWOSpecialChar = %Station% ReplaceChar := " -+\/*&:?<>|.," Loop, Parse, ReplaceChar StringReplace, StationNameWOSpecialChar, StationNameWOSpecialChar, %A_LoopField%, _, All If TVStationProgram%StationNameWOSpecialChar%%DateString% is space GoSub, DownloadTVStationProgram If LstTimePeriods contains None { LowerTimeLimit = a00:00 UpperTimeLimit = b24:00 }Else If LstTimePeriods contains Till { StringSplit, Item, LstTimePeriods, %A_space% LowerTimeLimit = a00:00 UpperTimeLimit = a%Item2% }Else If LstTimePeriods contains After { StringSplit, Item, LstTimePeriods, %A_space% LowerTimeLimit = b%Item2% UpperTimeLimit = b24:00 }Else { StringSplit, Item, LstTimePeriods, - , %A_space% LowerTimeLimit = a%Item1% If ( Item2 < Item1 ) UpperTimeLimit = b%Item2% Else UpperTimeLimit = a%Item2% } StringLeft, StationID, StationLink, 9 StationID = /tvpdb?d=tvs&id=%StationID% Loop, Parse, TVStationProgram%StationNameWOSpecialChar%%DateString% , `n { StringSplit, Item, A_LoopField, | If (LowerTimeLimit <= Item1 . Item2 AND Item1 . Item2 <= UpperTimeLimit ) LV_Add("",Station,Item2,Item4,Item5,Item6,Item1 . Item2,Item3 . Item4, StationID) Loop, %Item0% Item%A_Index% = } } LV_ModifyCol() LV_ModifyCol(1, "AutoHdr") LV_ModifyCol(2, "NoSort") LV_ModifyCol(3, "NoSort") LV_ModifyCol(5, 0) LV_ModifyCol(6, "0 Sort") LV_ModifyCol(7, 0) LV_ModifyCol(8, 0) GuiControl, +Redraw, LvTVProgram Return TVLocation: Gui, Submit, NoHide GuiControl, ,EdtTVProgramDetails, GuiControl, Disable ,BtnExportToFile Gui, ListView, LvTVProgram LV_Delete() Gui, ListView, LvStations LV_Delete() If Stations%TVLocation% is space GoSub, DownloadTVOverView Loop, Parse, Stations%TVLocation%, `n { StringSplit, Item, A_LoopField, | LV_Add("",Item2,Item1) } LV_ModifyCol(1, "Sort") GuiControl, +List, LvStations GuiControl, , LstProgramDays, % ProgramDays%TVLocation% StringSplit, TimeInSecondsProgramDays, ProgramDates%TVLocation%, | GuiControl, Choose, LstProgramDays, 1 Return DownloadTVStationProgram: URL := RootURL%TVLocation% . "/tvpdb?d=tvs&id=" . StationLink%A_index% . "&startdate=" . DateString URLDownloadToFile, %URL%, TVStationProgram.txt FileRead, TVStationProgram, TVStationProgram.txt FileDelete, TVStationProgram.txt StringReplace, TVStationProgram, TVStationProgram, | ,, All If ( TVLocation > 4 ) { ;it is US StringReplace, TVStationProgram, TVStationProgram,
  • , |, All StringSplit, TVStationProgram , TVStationProgram, | ListOfStationPrograms = Loop, % TVStationProgram0 - 1 { i := A_Index + 1 Program := TVStationProgram%i% StringReplace, Program, Program, ,|, All StringReplace, Program, Program,  `;,0, All StringReplace, Program, Program, ">,|, All ;" StringReplace, Program, Program, ,|, All StringReplace, Program, Program, `n, , All StringReplace, Program, Program, `r, , All StringSplit, Program, Program, | StartTime := RemoveHTMLTags("<" . Program1) Link = If Program2 contains " ;" { StringSplit, Program , Program2, " ;" Link = %Program2% Program2 = <%Program3% } Title := ReplaceHTMLSpecialChars(RemoveHTMLTags(Program2)) ListOfStationPrograms = %ListOfStationPrograms%%StartTime%|%Title%|%Link%`n } } StringTrimRight, ListOfStationPrograms, ListOfStationPrograms, 1 StringSplit, StationProgram,ListOfStationPrograms,`n ListOfStationPrograms = PrefixB = a PrefixE = a Loop, % StationProgram0 - 1 { StringSplit, ItemA, StationProgram%A_Index%, | i := A_Index + 1 StringSplit, ItemB, StationProgram%i%, | ItemA1 := TransformTime(ItemA1) ItemB1 := TransformTime(ItemB1) If (ItemB1 < ItemA1) PrefixE = b ListOfStationPrograms = %ListOfStationPrograms%%PrefixB%|%ItemA1%|%PrefixE%|%ItemB1%|%ItemA2%|%ItemA3%`n If (ItemB1 < ItemA1) PrefixB = b } StringSplit, ItemA, StationProgram%StationProgram0%, | ItemA1 := TransformTime(ItemA1) ListOfStationPrograms = %ListOfStationPrograms%%PrefixB%|%ItemA1%|%PrefixE%|_____|%ItemA2%|%ItemA3% TVStationProgram%StationNameWOSpecialChar%%DateString% = %ListOfStationPrograms% Return TodayInSeconds(TVLocation) { StartDate = 19700101 Today = %A_YYYY%%A_MM%%A_DD% If TVLocation > 4 ;it is US Today += 1, Day Else If IsSummerTime(Today) Today += 7, Hours Else Today += 8, Hours Today -= %StartDate%, Seconds Return Today } IsSummerTime(DateTimeString = 0){ ;Check if DateTimeString is in summer time period of europe ;Summertime starts in europe on last sunday in march and ends on last sunday in october. ;Both days at 2am. ;if no DateTimeString is given, use now If !DateTimeString DateTimeString = %A_Now% ;if DateTimeString is not long enough, fill up with zeros DateTimeString = %DateTimeString%0000000000 ;get correct length for DateTimeString StringLeft, DateTimeString, DateTimeString, 10 ;get year in question StringLeft, Year, DateTimeString, 4 ;get last sunday in march of that year Loop, 7 { MarchDate := 32 - A_Index MarchDate = %Year%03%MarchDate% FormatTime, WDay , %MarchDate%, WDay If (WDay = 1) break } ;get last sunday in october of that year Loop, 7 { OctoberDate := 32 - A_Index OctoberDate = %Year%10%OctoberDate% FormatTime, WDay , %OctoberDate%, WDay If (WDay = 1) break } ;return 2 if DateTimeString is in between 2am and 3am on last sunday in october ;this is the time, when summer time is set back to normal time If DateTimeString between %OctoberDate%02 and %OctoberDate%03 Return 2 ;return 1 if DateTimeString is in summer time period If DateTimeString between %MarchDate%02 and %OctoberDate%02 Return 1 ;return 0 if DateTimeString is in normal time period Return 0 } DownloadTVOverView: URL := RootURL%TVLocation% . URLTVOverView%TVLocation% StringReplace, URL , URL , $DateInSeconds$ , % TodayInSeconds(TVLocation) URLDownloadToFile, %URL%, TVOverView.txt FileRead, FileContentTVOverView, TVOverView.txt FileDelete, TVOverView.txt ;get stations and their name StringReplace, TVOverView, FileContentTVOverView, | ,, All StringReplace, TVOverView, TVOverView, , | StringSplit, Station, Station, | ListOfStations = %ListOfStations%%Station1%| } StringTrimRight, ListOfStations, ListOfStations, 1 Sort, ListOfStations, U D| StringReplace, ListOfStations, ListOfStations, `n, , All StringReplace, ListOfStations, ListOfStations,
     `;,,All StringReplace, ListOfStations, ListOfStations, |, `n , All StringReplace, ListOfStations, ListOfStations, ">, | , All ;" Stations%TVLocation% = %ListOfStations% ;get available dates (one less than listed, since data isn't available) StringReplace, TVOverView, FileContentTVOverView, , | , All StringSplit, TVOverView, TVOverView, | ProgramDates%TVLocation% := GetDateStrings(TVOverView2, TVLocation) ProgramDays%TVLocation% := GetDayStrings(ProgramDates%TVLocation%, TVLocation) Return GetDayStrings(String, TVLocation) { Loop, Parse, String, | { StartDate = 19700101 StartDate += A_LoopField, Seconds If TVLocation > 4 ;it is US StartDate += -1, Days Else If IsSummerTime(Today) Today += 7, Hours Else Today += 8, Hours FormatTime, StartDate, %StartDate%,ShortDate DayString = %DayString%|%StartDate% } Return DayString } GetDateStrings(String, TVLocation){ Loop, Parse, String { If A_LoopField is Number NumberString = %NumberString%%A_LoopField% Else NumberString = %NumberString%| } Sort, NumberString, D| U StringTrimLeft, NumberString, NumberString, 1 StringTrimRight, NumberString, NumberString, 1 Today := TodayInSeconds(TVLocation) Loop, Parse, NumberString, | If (A_LoopField >= Today) DateString = %DateString%%A_LoopField%| ;remove last pipe and last date, since there is no TV data available for that date StringGetPos, PosLast, DateString, | , R2 StringLeft, DateString, DateString, PosLast Return DateString } TransformTime(String) { Loop, Parse, String If A_LoopField is Number TimeString = %TimeString%%A_LoopField% If String contains pm,PM If TimeString < 1200 TimeString += 1200 If String contains am,AM If TimeString >= 1200 TimeString -= 1200 Loop, % 4 - StrLen(TimeString) TimeString = 0%TimeString% StringLeft, Left, TimeString, 2 StringRight, Right, TimeString, 2 Return Left . ":" . Right } RemoveHTMLTags(String) { Loop { Pos1 := InStr(String, "<") If Pos1 = 0 Break Pos2 := InStr(String, ">","",Pos1) If Pos2 = 0 Break StringLeft, Left, String, % Pos1 - 1 StringTrimLeft, Right, String, %Pos2% String = %Left%%Right% } Return String } ; Create Status Bar for Last GUI, divide it into segments, return its handle ; segs = right-edge positions of segments in string "10,20,-1" (-1 = right border) SB_Segments(segs = -1, GuiID = 1){ Gui, %GuiID%:+Lastfound WinGetPos, , , , GuiHeight Gui, %GuiID%:Show, % "h" GuiHeight -10 ;\/(line below) WS_CHILD (0x40000000) + WS_VISIBLE (0x10000000) BarHWND := DllCall("CreateStatusWindow", int, 0x50000000, str, "", UInt, WinExist(), UInt, 5555) IfEqual segs,0, SetEnv segs, StringReplace segs,segs,`,,`,,UseErrorLevel n := ErrorLevel + 1 ; # segments VarSetCapacity( parts, 4*n ) ; Reserve 4 Bytes for each segment Loop Parse, segs, `, ; Fill the var 'parts' with the positions InsertInteger( A_LoopField, &parts + 4*A_Index-4 ) SendMessage 0x404,%n%,&parts,,ahk_id %BarHWND% ; Send number of segments, positions to status bar Return BarHWND } ;Add 'text' to segment in the status bar SB_Text(BarHWND, seg, text){ SendMessage 0x401,% seg-1,&text,,ahk_id %BarHWND% ; 0x401 = SB_SETTEXT } ;Copy bytes in pInteger into pAddress as raw binary data InsertInteger(pInteger, pAddress, pSize = 4){ Loop %pSize% DllCall("RtlFillMemory", UInt,pAddress+A_Index-1, UInt,1, UChar, pInteger >> 8*A_Index-8 & 0xFF ) }