Quote:
//echo -ag $hget(balloonque,0).item showed 2 items still existed in the que, those 2 are queEND and queDONE.

As it should thats the last DONE and END of queue markers, the values in them should have matched and the window stopped displaying.
Is it possable something else in your script is adjusting these values., remeber the hashtable well/should always have these values, however the code below should alos remove them when they match.
Code:
if ($window(@balloonnotice)) {
    if ($ballooncfg(enableque) == 1) { 
      ;write $balloonquefile $1-
      var %queEND = $calc(1 + $hget(balloonque,queEND))
      hadd -sm balloonque que $+ %queEND $1-     
      hadd -sm balloonque queEND %queEND
      halt
    }
  }
  if (!$window(@balloonnotice)) {
    if ($calc($hget(balloonque,queDONE)) < $calc($hget(balloonque,queEND))) {
      var %queDONE = $calc(1 + $hget(balloonque,queDONE))
      var %balltitmess = $hget(balloonque,que $+ %queDONE)
      hdel -s balloonque que $+ %queDONE
      hadd -sm balloonque queDONE %queDONE
      if (%queDONE >= $calc($hget(balloonque,queEND))) { hfree -w balloonque | hmake balloonque 100 }
    }
    ;if ($lines($balloonquefile)) { var %balltitmess = $read($balloonquefile,1) | ;write -dl1 $balloonquefile }
    else { var %balltitmess = [ [ $1- ] ] }

;moves on to display the window show the info, then closes to run this again checking if anything still exists


Doh! just saw your last line
ok so you dont it already!