Я уже посмотрел на этот вопрос , и я уже проверил предложения, которые были сделаны там. Моя программа создает и уничтожает множество элементов управления пользовательского интерфейса ( много элементов управления пользовательского интерфейса), и все, что заставляет элементы управления зависать после их «разрушения», вызовет эту проблему. (Интересный факт: если вы не установите для свойства ToolStrip
элемента управления Visible
значение false, прежде чем уничтожить его контейнер, он не удаляется, поскольку он все еще зарегистрирован в Windows для получения событий изменения темы; он только отменяет регистрацию само по себе, когда его не видно, и у него, очевидно, нет никакого способа узнать, что это происходит, когда его контейнер разрушается.)
Дело в том, что на самом деле возможно, что мое приложение действительно работает без оконных дескрипторов. Программа имеет единую форму, которая имеет вложенные элементы управления вкладками. Каждая родительская вкладка имеет 12 или 13 дочерних вкладок, а дочерняя вкладка может иметь 30 или 40 элементов управления. Для пользователя вполне возможно иметь 15 родительских вкладок, открытых в любой момент времени, и это становится частью более 5000 живых элементов управления в приложении. И я знаю, что многие из моих элементов управления используют более одного дескриптора окна.
(И прежде чем вы скажете: «Ну, похоже, вы неправильно спроектировали пользовательский интерфейс», позвольте мне не обращать на это внимания: причина, по которой приложение существует в первую очередь, заключается в том, что пользователи имеют огромное пространство данных, которые они должны быть в состоянии быстро перемещаться. В действительности, вкладки внутри вкладок действительно работают для них.)
Насколько я понимаю, существует жесткое ограничение в 10 000 оконных дескрипторов на приложение. Если это действительно так (я понимаю, что многие вещи не соответствуют действительности), тогда мне придется управлять их использованием в своем приложении. Например, я могу выбросить содержимое наименее недавно использованной вкладки, когда у меня заканчиваются дескрипторы окон.
Но как мне узнать, что у меня закончились оконные ручки? И действительно ли это правильный подход к проблеме?
(Это одна из многих причин, по которым я хотел бы перестроить этот интерфейс в WPF.)