Предположим, что в Windows открыто несколько окон (HWND) одного и того же класса окон. Как вы отслеживаете данные контекста в оконной процедуре, чтобы, например, окно 1 не изменялось, когда пользователь пытался набрать в окне 2?
CreateWindow () не возвращается до тех пор, пока WndProc () не будет вызван несколько раз, поэтому вы не можете просто установить результирующий HWND для данных контекста и выполнить поиск в WndProc (); вам нужно установить его в WndProc ().
WndProc () напрямую не передает контекстную информацию, кроме сообщений о создании окна, но, к сожалению, сообщения о создании окна не совсем первые сообщения, которые передаются в WndProc (). Нет, я нахожу такие вещи, как WM_SIZE, WM_NCSIZE и даже некоторые другие, переданные прежде, чем я когда-либо увижу WM_CREATE.
Хранение HWND в механизме хранения связанного списка будет неэффективным при большом количестве окон: каждый элемент управления в окне - это просто другой тип окна и, следовательно, другой HWND, который необходимо отслеживать; после нескольких сотен элементов управления поиск связанного списка для HWND станет основным узким местом в программе после того, как несколько десятков сообщений будут переданы в программу за короткий промежуток времени!
Из того, что я слышал, некоторые люди используют SetWindowLong () - но я также слышал, что некоторым библиотекам нравится использовать это тоже для хранения своей собственной контекстной информации отдельно от программы, и что иногда могут происходить конфликты данных окна. Как этого можно избежать?