Cassius, msg $active will not always work because you have DCC chats that requery =$nick for instance. Also why even bother to check if the string is listed, and not just go through with the replace. Im sure the $replace has a condition in it already to check, here your just wasting that .0000001 second of resource. >:D

Code:
on 1:INPUT:*: {
  if ($left($1, 1) !isin $+(/,$readini($mircini, text,commandchar))) {
    /say $replace($1-, %happy, %happyc)
    /halt
  }
}


Say will work just fine covering all possible windows.