在.NET MDI应用程序中创建窗口句柄时出错

时间:2011-04-21 09:44:23

标签: .net tabs window mdi

我有一个带选项卡控件的MDI应用程序。在某些机器上,打开新选项卡时出现“创建窗口句柄时出错”异常。这只发生在某些机器上,主要是慢机器。 使用.NET Framework 4.0。

我过去几天一直在调查这个问题,这让我疯了!我在MSDN论坛上发现了以下内容 Hans Passant在此MSDN Forum的解决方案 根据答案,它与活跃的MDI儿童处于最大化状态有关。给定的解决方案是在显示新选项卡之前将活动子项设置为正常窗口状态,然后再将其恢复。这个解决方案有效,但我真的不喜欢解决方法导致的闪烁。

堆栈跟踪如下:

创建窗口句柄时出错:

   at System.Windows.Forms.NativeWindow.WindowClass.Callback(IntPtr hWnd, Int32 msg, 
   at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
   at System.Windows.Forms.Control.CreateHandle()
   at System.Windows.Forms.Form.CreateHandle()
   at System.Windows.Forms.Control.get_Handle()
   at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
   at System.Windows.Forms.Control.Show()
   at Client.UI.WinForms.Controls.TabManager.OpenNewTab(BaseTab2 tab) in WinForms\Forms\Tabs\TabManager.cs:line 82
   at Client.UI.WinForms.Controls.TabManager.OpenTab(BaseTab2 tab) in WinForms\Forms\Tabs\TabManager.cs:line 183
   at Client.UI.WinForms.MainForm.buttonLicenses_Click(Object sender, EventArgs e) in WinForms\Forms\MainForm.cs:line 4372

代码:

    private void OpenNewTab(BaseTab2 tab)
    {
        tab.MdiParent = MainForm.Instance;
        tab.WindowState = FormWindowState.Maximized;
        tab.Show(); <----- [EXCEPTION THROWN HERE]

        if (tab.Path != String.Empty)
        {
            RecentManager.Add(tab.Path);
            RecentManager.SetOpen(tab.Path, true);
        }
    }

更新:在Microsoft support发现此信息 当满足以下两个条件时,就会发生这种情况。

  1. MDI子窗体包含一个控件,用于控制其他控件。
  2. MDI子窗体上的父控件从布局或调整大小事件的事件处理程序中的Controls集合中移除子控件。

1 个答案:

答案 0 :(得分:3)

Microsoft支持文章与您找到的MSDN论坛帖子相同。这与你的不太匹配。使用Taskmgr.exe,Processes选项卡进行诊断。查看+选择列并勾选句柄,USER对象和GDI对象。在使用过程中请注意这些值。

可能的情况是,您将看到USER对象值无限制地攀升。当它达到10000时,Windows就会拉出地毯,这就是一个进程创建的窗口太多了。

它是由代码中的父级删除控件而不调用它们的Dispose()方法引起的。如果Taskmgr.exe无法帮助您找到它,请在代码中搜索“Controls.Remove”或“Controls.Clear”。也许你正在删除一个标签页。您删除的控件暂时重新设置为“停车窗口”的父级。如果你不给他们另一个父母或者不调用他们的Dispose()方法,他们将永远陷在那里。那是泄密。炸弹的代码不是导致问题的代码。