Кажется, что самая большая причина, по которой это сложно, состоит в том, что всплывающее окно теряет фокус, прежде чем основная форма деактивируется, поэтому активное окно всегда будет в приложении во время этого события. Действительно, вы хотите знать, будет ли оно оставаться активным окном после окончания события.
Вы можете установить какую-то схему, в которой вы помните, что всплывающее окно теряет фокус, откладывая тот факт, что вам нужно будет его закрыть, и в случае события LostFocus
или Deactivate
основной формы приложения отмените записка, которая говорит вам, что вам нужно закрыть ее; но проблема в том, когда вы обработаете заметку?
Я думаю, что может быть проще, по крайней мере, если всплывающее окно является прямым потомком основной формы (что, я подозреваю, в вашем случае может быть) перехватить событие Focus
или, возможно, даже Click
основной формы и используйте ее, чтобы закрыть всплывающее окно, если оно открыто (возможно, путем сканирования его списка дочерних форм на наличие тех, которые реализуют интерфейс ICloseOnLostFocus, так что у всплывающего окна будет возможность участвовать в принятии решения и делать все, что ему нужно делает).
Хотелось бы, чтобы я знал о лучшем документе, объясняющем, что на самом деле означают все эти события и как они упорядочены по отношению друг к другу, MSDN оставляет желать лучшего при их описании.