我正在调试一个(主要是)非托管代码之上的 Winforms UI 应用程序。有一点 UI 代码不是 WinForms:它使用 DirectX 直接绘制到某些 Panel 组件的表面上。为此,组件的窗口句柄在创建后被记录,任何后续调用需要执行此 DirectX 显示的模块所需的句柄(例如 GetWindowRect()),都使用此句柄。这种机制已经存在了一段时间,没有看到我要描述的问题,尽管也许我们只是幸运。我不再可以使用执行此操作的程序员。
我要解决的问题是,该区域的显示会间歇性地损坏。从后台线程调用此例程。我在我的应用程序日志中看到,例如,对 GetWindowRect() 的调用会突然并伴随绘图问题返回垃圾坐标。Window 句柄本身没有损坏,我有理由确定我们没有覆盖 Windows 数据结构;我可以停止并重新启动我们的显示流,GetWindowsRect() 将使用相同的 Windows 句柄再次开始返回良好的坐标。
如果这是在 .NET 级别,我会使用 Invoke 将绘图推迟到主线程。我的问题是,我们应该对这个 DirectX 调用做同样的事情吗?我试图找到微软关于不要在后台线程中绘制的警告,以提醒自己它是否扩展到使用 Windows 句柄;谁能指出我这一点?
个人电脑