'Set here the timeout so that the code doesn't stuck here (infinite loop)
var_timeout = 60
x=0
do
x=x+1
loop until Browser("Browser").Page("Page").WinElement("Message").Exist(1) or x>var_timeout
After you identify the object that changes in your application after you click a certain button, as in after clicking Save, the application return a message, you can put the object with Exist(1) statement.
The Parameter "1" of the object represents time in which the element should be checked, lower than that will not work always (I say this from experience) and higher is not desirable.
This is a snippet I use very often and I have good results, and I think it will suit your needs.
If the object does not have the Exist method please try .Object.isDisabled or .Object. (check what autocomplete shows here) for example Browser("Browser").Page("Page").WinElement("Message").Object.isDisabled where "Object" is a method that tries to use native object methods.
Please note that UFT is used for automated functional testing and will take some time to check the object (some miliseconds).
So the object appears and it takes some miliseconds or more for QTP to see that it exists or that a property of the object changed value.