保持控制

本文关键字:控制 | 更新日期: 2024-11-08 05:36:27

我有一个正在与之通信的非托管 DLL。有一个函数需要一个窗口句柄来绘制。但是,经过一些 MDI 操作、窗体隐藏和显示后,句柄会发生变化。不幸的是,我不能给DLL一个新的句柄,然后System.AccessViolationException引发。我可以使用一些方法来防止句柄重新创建吗?

保持控制

我有一个正在与之通信的非托管 DLL。有一个函数需要一个窗口句柄来绘制。但是,经过一些 MDI 操作、窗体隐藏和显示后,句柄会发生变化。不幸的是,我无法为 DLL 提供新句柄,然后System.AccessViolationException提高。

正确的解决方案是处理 HandleCreated 事件并通知 DLL 句柄已更改。但是你说你不能给DLL一个新的句柄。(为什么不呢?

我可以使用一些方法来防止句柄重新创建吗?

不,没有这样的方法。

问题是设置窗体的某些属性会导致框架在内部重新创建基础窗口,这当然会导致窗体与不同的句柄相关联。但这不是一个错误,它解决了这样一个事实,即某些窗口样式属性在创建时被缓存,并且无法在不重新创建窗口的情况下强制更新它们。

因此,如果要确保窗口句柄永远不会更改

,则必须确保永远不会更改导致框架重新创建其句柄的窗体的任何属性。

有了像ILSpy这样的东西,你可以准确地找出这些属性/方法。罪魁祸首通常会调用一个名为RecreateHandle的方法(在某些情况下,您甚至可以称自己为该方法以达到类似的效果)。

我想不出另一种解决方法。无法告诉 Windows 使用与旧对象相同的句柄重新创建对象。