While playing around with
Paint.NET today (great free basic photo editing tool, essentially paint on steroids), and was pleasantly surprised when I got this as I went to close it:

Isn't that more helpful than something like this:
Of course, if you have Windows Vista, you would've seen the former type everywhere, e.g.


From MSDN docs.
It's interesting how some small changes to the fundamental message box could make it that much better. The new
MSDN Vista UX Guide encourages these task-based dialog boxes instead of the old message-oriented ones, where the goal is to deliver the message, without caring what it was. With most message boxes nowadays being decisions anyway, they weren't very good at conveying it - I mean, face it, we've all blindly click Yes just to get rid of it. Now with these new ones, the question is clearly laid out, and the possible responses clearly indicated - no more generic Yes or No buttons, and although there is a default position for the usual action, we are forced to read the question now. Of course, we'll still get complacent when we get tons of these boxes, but it makes the occasional one much more effective.
It's nice to see Vista (and the Paint.NET guys) make the effort to change a long-standing element of the UI. Some may argue popup boxes are bad in the first place, but they'll be here for a long time to come to capture the user's attention.
<nerd bits>
The biggest barrier to these types of dialogs though are probably developers being lazy. After all, to get the above Microsoft Word message dialog, all you have to enter in C# is:
MessageBox.Show("Do you want to save the changes made to Document2?", "Microsoft Word", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
To get one of the newer taskdialogs, takes much more than a line of code. There doesn't seem to be any managed code wrapper, so you'll have to
dive into C++ or use P/Invoke. Unofficially, there's
this library at the
soon to be closed GotDotNet site, not sure how good it is though. Maybe I'm missing something here, or maybe it's coming out in .NET Framework 3.5, but it seems weird that there's no managed wrapper for this given that Microsoft is pushing managed code so much these days.