Ура!!! я это сделал, немного помучался, но всё же сделал!
Вместо использования звуков системы, я использовал её персонажа - старый добрый волшебник “Merlin”

...

Если в системе не найден персонаж, то выводится
TrayTip. А и ещё, чтобы персонаж ещё и говорил, в системе должен быть установлен
голосовой движёк.
При простое более 5-ти секунд, иконка трея меняется на неактивного юзера, при активности иконка обратно меняется на что-то вроде юзера в движении (не смог в системе найти более походящей иконки).
Также при простое в переменную $TotalTime накапливается общее время простоя (секунды), а при активности эта переменная сбрасывается на ноль (0)...
Также удалось заносить в массив отдельные заготовки сообщении, если есть файл сообщении (LazyMessages.dat), то с него считываются строки, если его нет, то в скрипте уже заготовлены 10 сообщении (на английском)...
Для выхода из скрипта в любое время, нужно нажать
Ctrl E (при английской раскладке).
В общем, на мой взгляд получилось довольно неплохо... правда есть пару моментов, например, как можно проверить закончил ли персонаж читать текст, и соответственно убить его?

... вот скрипт:
Код:

HotKeySet("^e", "Quit")
TraySetIcon("shell32.dll", 160)
TraySetToolTip("Laziness Detecter (!)")
Dim $MessagesArr[11]
$MessagesArr[0] = 10
$MessagesArr[1] = "You are been lazy for a long time <%n>"
$MessagesArr[2] = "This is enough, start doing something >:( - you are lazy to much (%n)"
$MessagesArr[3] = "Hello!? Any one is home? why you are so lazy so long time? <%n> do somthing!"
$MessagesArr[4] = "Hi! Don't you fill like cow? Laziness is reason number 1 of why people die"
$MessagesArr[5] = "It's been over a <%n> time sense you touch your computer, touch it now!"
$MessagesArr[6] = "I can not wait for you so long (%n), I am going to shutdown myself.... beep.. beeep.. beeeeeep"
$MessagesArr[7] = "Hey man, are you forgot about me? Fine! I want to divorced"
$MessagesArr[8] = "You have no check your email for <%n> time, maybe there something intersteing?"
$MessagesArr[9] = "There is a virus on your computer! (it exists there for a long time <%n>) perform virus checking immediately!"
$MessagesArr[10] = "Hi! What's up dog? Don't pay attention; I am just stupid character that doesn't need attention! >:("
$MessagesFile = "LazyMessages.dat"
If FileExists($MessagesFile) And FileRead($MessagesFile) <> "" Then $MessagesArr = StringSplit(FileRead($MessagesFile), @LF)
$Idle = 0
$TotalTime = 0
$MinLaziness = 10
$MaxLaziness = 60
$LazyLimit = Random($MinLaziness, $MaxLaziness, 1)
$TimeStamp = TimerInit()
AdlibEnable("CheckLaziness", 10)
While 1
$Idle = _IdleWaitCommit(0)
TraySetIcon("shell32.dll", 160)
TrayTip("", "", 0)
$TimeStamp = TimerInit()
$Idle = 0
$TotalTime = 0
WEnd
Func CheckLaziness()
$TimeDiff = Round(TimerDiff($TimeStamp)/1000)
If $TimeDiff > $LazyLimit And $Idle = 0 Then
TraySetIcon("shell32.dll", 111)
$TotalTime += $TimeDiff
$LazyTime = _SecsToTime($TotalTime, ":")
$TextToSay = StringReplace($MessagesArr[Random(1, $MessagesArr[0], 1)], "%n", $LazyTime)
$SleepTime = Round((StringLen($TextToSay)/7)*1000)
If StringLen($TextToSay) < 7 Then $SleepTime = 5000
CharacterMsg($TextToSay, Random(100, @DesktopWidth-100, 1), Random(10, @DesktopHeight-150, 1), $SleepTime)
If @error Then TrayTip("You are lazy", $TextToSay, 5, 1)
$LazyLimit = Random($MinLaziness, $MaxLaziness, 1)
$TimeStamp = TimerInit()
EndIf
If $TimeDiff >= ($LazyLimit/2) Then TrayTip("", "", 0)
If $TimeDiff >= 5 And $LazyLimit > 5 Then TraySetIcon("shell32.dll", 111)
EndFunc
Func _SecsToTime($iTicks, $Delim)
If Number($iTicks) >= 0 Then
$iHours = Int($iTicks / 3600)
$iTicks = Mod($iTicks, 3600)
$iMins = Int($iTicks / 60)
$iSecs = Round(Mod($iTicks, 60))
If StringLen($iHours) = 1 Then $iHours = "0" & $iHours
If StringLen($iMins) = 1 Then $iMins = "0" & $iMins
If StringLen($iSecs) = 1 Then $iSecs = "0" & $iSecs
$Time = $iHours & $Delim & $iMins & $Delim & $iSecs
Return $Time
Else
SetError(1)
Return 0
EndIf
EndFunc
Func _IdleWaitCommit($idlesec)
Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
Do
$iSave = DllStructGetData ($LastInputInfo, 2)
Sleep(200)
DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec
Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc
Func CharacterMsg($TextToSay, $MovexX=200, $MoveY=200, $Sleep=5000)
$figure = "merlin"
If $TextToSay = "" Then $TextToSay = "Oops! there was an Error!"
$Path = @WindowsDir & "\MSAGENT\CHARS\merlin.acs"
If Not FileExists($Path) Then Return SetError(1)
$AgentControl = ObjCreate("Agent.Control.1")
$SinkObject=ObjEvent($AgentControl, "event_")
If Isobj($AgentControl) Then $AgentControl.Connected = True
$AgentControl.Characters.Load($figure, $Path)
$A = $AgentControl.Characters($figure)
$A.MoveTo($MovexX, $MoveY, 0)
$A.Show
$A.Speak($TextToSay)
$A.Play("Greet")
$A.Play("RestPose")
Sleep($Sleep)
$A.Hide
$A.StopAll
$AgentControl.Characters.Unload($figure)
EndFunc
Func Quit()
Exit
EndFunc
P.S
Скрипт чёрно-белый потому как в разукрашенном виде он занимает более 40-ка тысяч строк.