Winforms问题 - 创建窗口句柄时出错

时间:2008-10-21 17:01:13

标签: c# windows winforms window-handles

我们在Winform应用程序中看到此错误。任何人都可以帮助您看到此错误的原因,更重要的是如何解决或避免它发生。

System.ComponentModel.Win32Exception: Error creating window handle.
   at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
   at System.Windows.Forms.Control.CreateHandle()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e)
   at System.Windows.Forms.ButtonBase.OnVisibleChanged(EventArgs e)

10 个答案:

答案 0 :(得分:49)

您是否运行Process Explorer或Windows任务管理器来查看GDI对象,句柄,线程和USER对象?如果没有,请选择要查看的列(任务管理器选择查看 - >选择列...然后运行您的应用并查看该应用的那些列,看看其中一列是否真的变大了。

可能是您已经清理了认为的UI组件但尚未处置。

Here's a link关于此可能会有所帮助。

祝你好运!

答案 1 :(得分:24)

您的应用程序的Windows句柄限制是10,000个句柄。您收到错误是因为您的程序创建了太多句柄。你需要找到内存泄漏。正如其他用户所建议的那样,使用Memory Profiler。我也使用.Net Memory Profiler。此外,如果您在表单关闭之前从表单中删除它们,请确保在控件上调用dispose方法(否则控件将不会处理)。您还必须确保没有向控件注册的事件。我自己也有同样的问题,尽管我已经知道,但我仍然有一些内存泄漏仍然无法实现......

答案 2 :(得分:11)

请参阅this post of mine about "Error creating window handle"以及它与USER对象和桌面堆的关系。我提供了一些解决方案。

答案 3 :(得分:5)

此问题几乎总是与GDI对象计数,用户对象计数或句柄计数有关,并且通常,因为您计算机上的内存不足。

当我跟踪其中一个错误时,我打开ProcessExplorer并观察这些列:句柄,线程,GDI对象,用户对象,私有字节,虚拟大小和工作集。

(根据我的经验,问题通常是由于事件处理程序持有对象并阻止它被丢弃而导致对象泄漏。)

答案 4 :(得分:2)

嗯,就我而言,它绝对是失控的用户对象。我查看了Windows任务管理器,果然,用户对象计数恰好是10'000。

我通过将属性或列表工作表的容器面板的Parent属性设置为Tab页面的属性,在Tab页面中动态嵌入属性和列表工作表。我有条件地回收或重新创建属性和列表表单,具体取决于列出的集合类型或被检查对象的类类型。

注意:在Delphi中,所有控件都有一个Owner和一个Parent属性。即使有人更改了控件的Parent属性,当拥有控件被销毁时,它仍将由其所有者处理。

在C#中,似乎是一个控件,例如Panel通过更改Panel.Parent属性以编程方式从表单重新分配给Tab页面,在Form上调用Dispose()将不会释放Panel,也不会在Tab页面上调用Controls.Clear()。即使直接调用Panel.Dispose()也不会实际处理它,除非事先将其Parent手动设置为null。

答案 5 :(得分:1)

我认为这通常与计算机内存耗尽有关,因此无法再创建窗口句柄。通常情况下,Windows也开始显示一些奇怪的行为。

答案 6 :(得分:1)

我添加了一张支票,让它有效......

if (_form.Handle.ToInt32() > 0)
{
   _form.Invoke(method, args);
}

总是如此,但是没有它,表单会抛出错误。 顺便说一下,我的手数大约是490万。

答案 7 :(得分:0)

我的应用程序中出现了同样的错误。我在单页中加载了很多控件。在按钮单击事件中我清除了控件。清除控件不会从内存中释放控件。从内存中释放控件。 我刚刚评论了controls.clear()方法,并包含几行代码来处理控件。 像这样的东西

对于每个ctl作为controlcollection中的控件

ctl.dispose()

下一步

答案 8 :(得分:0)

答案 9 :(得分:-2)

内存缺乏建议似乎不是一个糟糕的导致。

你的程序做了什么才能得到这个错误?

是否创建了许多窗口或控件? 它是以编程方式创建它们而不是在设计时创建它们吗? 如果是这样,你是在循环中这样做的吗?这个循环是无限的吗? 你是否正在以其他方式消耗大量的内存?

在任务管理器中查看应用程序使用的内存时会发生什么?它是否会飞向月球?或者更好的是,如上所述,使用流程监控器深入了解详细信息。