Боюсь, я не знаю, какие именно классы или функции задействованы, но я могу дать вам общее представление о процессе.
Во-первых, следует понимать, что каждое приложение (возможно, каждое окно) имеет очередь событий, поддерживающую его. Каждый из них обслуживается потоком, который просто извлекает событие * из очереди, выполняет некоторую обработку, а затем возвращается к ожиданию следующего события. «Пляжный мяч» появляется (когда система вынуждена), когда очередь событий не обслуживается достаточно быстро. «Замороженная» очередь событий подразумевает, что приложение заблокировано при ответе на какое-либо событие в прошлом.
Теперь - вне контекста отладки - вы не сможете получить доступ к другому приложению и возиться с очередью событий потока, чтобы увидеть, обслуживается ли он. Но вместо этого вы можете периодически публиковать событие, которое будет запрещать ответ, и если этот ответ не приходит, вы знаете, что приложение «заблокировано».
Это составляет опрос, так что будьте осторожны с последствиями производительности.
* События - это такие вещи, как нажатие клавиши, нажатие клавиши вверх, перемещение мыши, перекраска и т. Д.