Du könntest den Status des letzten Visibility-Events aufzeichnen:
use Tk;
$top = new MainWindow;
$top->bind('<Visibility>' => sub {
my $w = shift;
my $e = $w->XEvent;
warn $e->s;
});
MainLoop;
Da gibt es die möglichen Werte VisibilityUnobscured, VisibilityPartiallyObscured und VisibilityFullyObscured.
Ansonsten könnte man wahrscheinlich über X11::Protocol was basteln (Traversieren aller Fenster und Feststellen, welche Fenster über welchen liegen). Allerdings nur für X11, nicht für Windows.