C# 保持控制,处理

C# 保持控制,处理,c#,.net,winforms,winforms-interop,C#,.net,Winforms,Winforms Interop,我有一个与之通信的非托管DLL。有一个函数需要一个窗口句柄来绘制。但是,在一些MDI操作、表单隐藏和显示之后,句柄会发生更改。不幸的是,我不能给DLL一个新句柄,然后System.AccessViolationException会引发。我可以使用一些方法防止重新创建句柄吗 我有一个与之通信的非托管DLL。有一个函数需要一个窗口句柄来绘制。但是,在一些MDI操作、表单隐藏和显示之后,句柄会发生更改。不幸的是,我不能给DLL一个新句柄,然后System.AccessViolationExceptio

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

我有一个与之通信的非托管DLL。有一个函数需要一个窗口句柄来绘制。但是,在一些MDI操作、表单隐藏和显示之后,句柄会发生更改。不幸的是,我不能给DLL一个新句柄,然后
System.AccessViolationException
引发

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

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

不,没有这样的方法

问题是设置表单的某些属性会导致框架在内部重新创建底层窗口,这当然会导致表单与不同的句柄相关联。但这不是一个bug,它是围绕着这样一个事实工作的,即某些窗口样式属性在创建时被缓存,并且在不重新创建窗口的情况下无法强制更新它们

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

使用类似的工具,您可以准确地找出这些属性/方法。罪犯通常会调用名为的方法(在某些情况下,您甚至可以调用自己来实现类似的效果)

我想不出其他解决办法。无法告诉Windows使用与旧对象相同的句柄重新创建对象

我有一个与之通信的非托管DLL。有一个函数需要一个窗口句柄来绘制。但是,在一些MDI操作、表单隐藏和显示之后,句柄会发生更改。不幸的是,我不能给DLL一个新句柄,然后
System.AccessViolationException
引发

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

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

不,没有这样的方法

问题是设置表单的某些属性会导致框架在内部重新创建底层窗口,这当然会导致表单与不同的句柄相关联。但这不是一个bug,它是围绕着这样一个事实工作的,即某些窗口样式属性在创建时被缓存,并且在不重新创建窗口的情况下无法强制更新它们

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

使用类似的工具,您可以准确地找出这些属性/方法。罪犯通常会调用名为的方法(在某些情况下,您甚至可以调用自己来实现类似的效果)


我想不出其他解决办法。无法告诉Windows使用与旧对象相同的句柄重新创建对象。

谢谢您的回答。我还没有创建这个DLL,作者也没有导出函数来更改绘图窗口。幸运的是,我找到了解决办法。在MDI容器中隐藏父窗体时,将重新创建句柄。因此,我将其从父级中删除,并在再次显示表单后添加。把手保持不变。☺谢谢你的回答。我还没有创建这个DLL,作者也没有导出函数来更改绘图窗口。幸运的是,我找到了解决办法。在MDI容器中隐藏父窗体时,将重新创建句柄。因此,我将其从父级中删除,并在再次显示表单后添加。把手保持不变。☺