У меня есть приложение Delphi 6, которое сильно многопоточно. У меня есть созданный мной компонент, который происходит от TWinControl. Когда я впервые построил его, я использовал скрытое окно и его WndProc для обработки сообщений, выделенных с помощью AllocateHwnd (). Недавно я начал очищать WndProc в своем коде и решил удалить вспомогательный WndProc (). Я изменил компонент, чтобы вместо этого переопределить метод базового класса WndProc () и оттуда выполнять свою собственную обработку сообщений Windows. В этом WndProc () я сначала вызвал унаследованный обработчик, а затем обработал свои пользовательские сообщения (смещения WM_USER), установив для поля Результат сообщения значение 1, если я нашел одно из моих пользовательских сообщений и обработал его.
Одно важное замечание. Я помещаю строку кода в начало переопределения WndProc (), которое вызывает исключение, если текущий идентификатор потока не является основным потоком VCL. Я хотел убедиться, что WndProc () выполняется только в контексте основного потока VCL.
После того, как я проделал это и запустил свою программу, я наткнулся на кое-что, что мне показалось действительно странным. Я запускал свою программу как обычно и выполнял различные задачи без ошибок. Затем, когда я перешел к элементу управления TMemo, который находится на той же странице, что и мой потомок TWinControl. Если я щелкну внутри этого элемента управления TMemo, сработает проверка основного потока в моем переопределении WndProc (). У меня была установлена точка останова, и когда я перешел к стеку вызовов, на нем не было ничего выше моего переопределения WndProc ().
Насколько я могу судить (и я дважды проверил), я не делаю явных вызовов переопределения WndProc (). Я бы никогда этого не сделал. Но учитывая, что мой компонент TWinControl был бы создан в основном потоке VCL, как и все другие компоненты, я не могу понять, как переопределение WndProc () когда-либо будет выполняться в контексте фонового потока, особенно только когда действие пользовательского интерфейса, подобное щелчок мыши произойдет. Я понимаю, как мой WndProc () привязан к элементу управления TMemo, поскольку все дочерние окна зависают от окна верхнего уровня WndProc (), по крайней мере, это мое понимание. Но поскольку все окна компонентов были бы созданы в основном потоке VCL, то все их очереди сообщений также должны выполняться в этом контексте, верно?
Итак, какую ситуацию я мог создать, чтобы мой WndProc () работал, и только иногда, в контексте фонового потока?