我有一个多线程的 Delphi 6 应用程序。我创建了一个源自 TWinControl 的组件。当我第一次构建它时,我使用了一个隐藏窗口,它是 WndProc 来处理消息,由 AllocateHwnd() 分配。最近我开始清理代码中的 WndProc,并决定删除辅助的 WndProc()。我更改了组件以覆盖基类 WndProc() 方法,并从那里进行自定义 Windows 消息处理。在那个 WndProc() 中,我首先调用了继承的处理程序,然后处理了我的自定义消息(WM_USER 偏移量),如果找到我的一条自定义消息并处理它,则将消息结果字段设置为 1。
一个重要的注意事项。我在 WndProc() 覆盖的顶部放置了一行代码,如果当前线程 id 不是 VCL 主线程,则会引发异常。我想确保 WndProc() 仅在主 VCL 线程的上下文中执行。
在这样做并运行我的程序之后,我遇到了一些看起来非常奇怪的事情。我正常运行我的程序,并且没有错误地完成了各种任务。然后,当我转到与我的 TWinControl 后代位于同一页面上的 TMemo 控件时。如果我在该 TMemo 控件内单击,则会触发我的 WndProc() 覆盖中的主线程检查。我在上面设置了一个断点,当我进入调用堆栈时,在我的 WndProc() 覆盖之上没有任何内容。
据我所知,并且我已经仔细检查过,我没有对 WndProc() 覆盖进行显式调用。那不是我曾经做过的事情。但是鉴于我的 TWinControl 组件将像所有其他组件一样在主 VCL 线程上创建,我无法理解 WndProc() 覆盖将如何在后台线程的上下文中执行,尤其是只有当 UI 操作像鼠标点击会发生。我了解我的 WndProc() 如何与 TMemo 控件相关联,因为所有子窗口都挂在顶层窗口 WndProc() 之外,至少这是我的理解。但是由于所有组件窗口都将在主 VCL 线程上创建,因此它们的所有消息队列也应该在该上下文中执行,对吗?
那么我可以创建什么样的情况来使我的 WndProc() 运行,并且仅在某些情况下,在后台线程的上下文中运行?