Code that gets title through readProcessMemory is optional, you can read winamp title (only if it doesn't scroll ;-) through standard AHK commands.
Somewhat new feature - script show first 10 seconds running then traytip disappears. Same is for fast rewinding through keyboard control if you add call to "getWinampTitleFunc(1)" to your code.
setTimer,getWinampTitleTimer,1000 ; initial run getWinampTitleTimer: getWinampTitleFunc() return ; set "forceShow" to 1 if you call it from winamp-controlling functions in AHK. This will show current pos/trackLength & song name. getWinampTitleFunc(forceShow=0) ;; { static oldTitle,showCount,trackLastShowPos DetectHiddenWindows, on ifWinNotExist, ahk_class Winamp v1.x { setTimer,getWinampTitleTimer,10000 return } winGet,wa_pid,pid sendmessage,0x400,0,125 ; IPC_GETLISTPOS 125 pl#:=errorlevel sendmessage,0x400,pl#,212 ; IPC_GETPLAYLISTTITLE 212 char *name=SendMessage(hwnd_winamp,WM_WA_IPC,index,IPC_GETPLAYLISTTITLE); title#:=errorlevel ProcessHandle:=DllCall("OpenProcess",int,24, char,0, uint,wa_pid) ;PROCESS_VM_OPERATION | PROCESS_VM_READ varSetCapacity(title,256,0) dllCall("ReadProcessMemory",uint,processHandle, uint,title#, str,title, uint,256, uintP,len) DllCall("CloseHandle", uint, ProcessHandle) sendmessage,0x400,1,105 ; IPC_GETOUTPUTTIME 105 (1=track len in secs) trackLen:=errorlevel*1000 sendmessage,0x400,0,105 ; IPC_GETOUTPUTTIME 105 (0=track pos in ms) trackPos:=iif(errorlevel>trackLen,0,errorlevel) showCount ++ if (title<>oldTitle) or forceShow { oldTitle:=title showCount:=0 setTimer,getWinampTitleTimer,1000 } else if (showCount>10) { traytip setTimer,getWinampTitleTimer,% trackLen-trackPos+1000 return } traytip,,% title " - " formatSeconds(trackPos/1000) " / " formatSeconds(trackLen/1000) . iif(trackLastShowPos=trackPos," [STOPPED]"," [PLAY]") trackLastShowPos:=trackPos } formatSeconds(sec) ;; { sec:=floor(sec) return iif(floor(sec/3600),floor(sec/3600) ":","") . mod(floor(sec/60),60) ":" strMid(100+mod(sec,60),2) } iif(expr, a, b) ;; { if (expr) return a else return b } strMid(s, begin, n=0x7FFF, Left=0) ; if L<>0 then mid to the left ;; { if Left=0 stringMid,s,s,%begin%,%n% else stringMid,s,s,%begin%,%n%,L return s }