Исключение «Ошибка при создании дескриптора окна» происходит с выпадающим списком на панели инструментов - PullRequest
2 голосов
/ 06 сентября 2011

Я работаю над большим приложением WinForm на основе .Net 2.0 / C #, при запуске приложения на ноутбуке Dell E6520 (Win7 Pro SP1, 8G RAM) постоянно воспроизводится ошибка «Ошибка при создании дескриптора окна».он хорошо работает на настольных компьютерах, включая XP, Win7, 2008).

Вот стек исключений:

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.ComboBox.CreateHandle()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.ControlCollection.Add(Control value)
   at System.Windows.Forms.WindowsFormsUtils.ReadOnlyControlCollection.AddInternal(Control value)
   at System.Windows.Forms.ToolStripControlHost.SyncControlParent()
   at System.Windows.Forms.ToolStripControlHost.OnParentChanged(ToolStrip oldParent, ToolStrip newParent)
   at System.Windows.Forms.ToolStripItem.set_ParentInternal(ToolStrip value)
   at System.Windows.Forms.ToolStripSplitStackLayout.LayoutHorizontal()
   at System.Windows.Forms.ToolStripSplitStackLayout.LayoutCore(IArrangedElement container, LayoutEventArgs layoutEventArgs)
   at System.Windows.Forms.Layout.LayoutEngine.Layout(Object container, LayoutEventArgs layoutEventArgs)
   at System.Windows.Forms.Control.OnLayout(LayoutEventArgs levent)
   at System.Windows.Forms.ScrollableControl.OnLayout(LayoutEventArgs levent)
   at System.Windows.Forms.ToolStrip.OnLayout(LayoutEventArgs e)
   at System.Windows.Forms.Control.PerformLayout(LayoutEventArgs args)
   at System.Windows.Forms.Control.System.Windows.Forms.Layout.IArrangedElement.PerformLayout(IArrangedElement affectedElement, String affectedProperty)
   at System.Windows.Forms.Layout.LayoutTransaction.DoLayout(IArrangedElement elementToLayout, IArrangedElement elementCausingLayout, String property)
   at System.Windows.Forms.Control.OnResize(EventArgs e)
   at System.Windows.Forms.Control.OnSizeChanged(EventArgs e)
   at System.Windows.Forms.Control.UpdateBounds(Int32 x, Int32 y, Int32 width, Int32 height, Int32 clientWidth, Int32 clientHeight)
   at System.Windows.Forms.Control.UpdateBounds()
   at System.Windows.Forms.Control.WmWindowPosChanged(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ToolStrip.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Это происходит, когда отображается форма, где внутри есть полоса инструментов, содержащая выпадающие списки и кнопки.,Позже они добавляются в набор инструментов динамически после того, как форма создана, оставаясь невидимой, путем вызова метода, приведенного ниже:

private void Init()
{
  ...
  foreach (ToolBarItemConfig item in configuredToolbarItems)
  {
    ToolStripItem toolStripItem = createToolStripItem(item);
    toolStrip.Items.Add(toolStripItem);
    if (toolStripItem is ToolStripComboBox)
      populateComboBox(toolStripItem as ToolStripComboBox, item); // populate items of ToolStripComboBox
  }
  ...
}

Обратите внимание, в рамках Init, набор инструментов невидим, и дескрипторы новых элементов ToolStripComboBox не создаются (найденыиз журнала).Я могу понять, что создание дескриптора отложено по намерению, потому что они на самом деле еще не показаны.Однако, позже, форма наконец-то показывается, и приходит исключение.

Я получил большое вдохновение от этой статьи и мог решить эту проблему, форсировав создание дескриптора, сразу получив доступ к свойству Handle.когда создаются элементы ToolStripComboBox.

Теперь я понимаю, что ToolStrip пытается воссоздать дескриптор комбинированных списков в своем OnLayout при отображении формы, но в то время эти дескрипторы еще не созданы, поэтому ничегоуничтожить -> приходит «Ошибка при создании дескриптора окна».Однако это только мое предположение, так как основная причина проблемы остается для меня неясной, особенно я не могу объяснить, почему это происходит только на конкретном ноутбуке, но не на настольном компьютере.

Может ли кто-нибудь помочь мне понять основную причину проблемы?это так, я могу быть уверен, что подобная проблема не повредит снова в будущем?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 06 сентября 2011
У

была похожая проблема, количество пользовательских объектов (дескрипторов) растет и взрывается, потому что вы превышаете предел, не поддерживаемый Windows.Мы решили эту проблему, избавившись от неиспользуемых скрытых форм и выполнив некоторую основную очистку.

В шортах не оставляйте слишком много элементов управления или окон / форм открытыми или скрытыми и не расположенными, поскольку эти объекты по-прежнему используют дескрипторы окон.*

см. Эту интересную статью от "парня, который знает"; -)

Расширение границ Windows: объекты USER и GDI - часть 1

0 голосов
/ 29 августа 2014

Я использовал диспетчер задач, чтобы найти проблему.Сначала я добавил несколько столбцов (User Objects, GDI) на вкладку процесса (вид -> выбрать столбцы)После того, как я запускаю свое приложение и перемещаюсь внутри форм.И я вижу, что количество пользовательских объектов растет и растет.После некоторого критического количества приложение вылетает.Эта ссылка мне очень помогает http://blogs.msdn.com/b/jfoscoding/archive/2005/08/12/450835.aspx

...