web-dev-qa-db-ja.com

Winformsの問題-ウィンドウハンドルの作成エラー

Winformアプリケーションでこのエラーが発生しています。このエラーが表示される理由、さらに重要なこととして、エラーの修正方法または発生を回避する方法について、誰でも助けてくれますか?.

 System.ComponentModel.Win32Exception:ウィンドウハンドルの作成エラー。
 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)
59
leora

Process ExplorerまたはWindowsタスクマネージャーを実行して、GDIオブジェクト、ハンドル、スレッド、およびUSERオブジェクトを確認しますか?そうでない場合は、表示する列を選択します(タスクマネージャーは[表示]-> [選択]を選択します列...次に、アプリを実行し、そのアプリのそれらの列を見て、そのうちの1つが本当に大きくなっているかどうかを確認します。

thinkがクリーンアップされているが破棄されていないUIコンポーネントを持っている可能性があります。

ここにリンクがあります これについては役に立つかもしれません。

がんばろう!

51
itsmatt

アプリケーションのウィンドウハンドル制限は10,000ハンドルです。プログラムが作成しているハンドルが多すぎるため、エラーが発生しています。メモリリークを見つける必要があります。他のユーザーが提案したように、メモリプロファイラーを使用します。 .Net Memory Profilerも使用します。また、コントロールをフォームから削除する場合は、コントロールでdisposeメソッドを呼び出していることを確認してくださいbeforeフォームが閉じます(そうでない場合、コントロールは破棄されません)。また、コントロールに登録されているイベントがないことを確認する必要があります。私自身も同じ問題を抱えており、すでに知っていることにも関わらず、いまだにメモリリークがあり、それが私を避け続けています。

25
mjezzi

「ウィンドウハンドルの作成エラー」についての私のこの投稿 と、それがUSERオブジェクトおよびデスクトップヒープとどのように関係するかを参照してください。いくつかのソリューションを提供します。

11
Fabrice

この問題は、ほとんど常にGDIオブジェクトカウント、ユーザーオブジェクトカウント、またはハンドルカウントに関連しています。通常、マシンのメモリ不足のため、notです。

これらのバグの1つを追跡しているとき、ProcessExplorerを開いて、ハンドル、スレッド、GDIオブジェクト、ユーザーオブジェクト、プライベートバイト、仮想サイズ、ワーキングセットの列を確認します。

(私の経験では、問題は通常、イベントハンドラーがオブジェクトを保持し、それが破棄されるのを防ぐことによるオブジェクトリークです。)

6
AlfredBr

さて、私の場合、制御不能なのは間違いなくUSERオブジェクトでした。私はWindowsタスクマネージャーを調べましたが、確かに、USERオブジェクトの数は正確に10'000でした。

プロパティまたはリストシートのコンテナパネルのParentプロパティをタブページのプロパティに設定することにより、プロパティとリストシートをタブページに動的に埋め込みます。リストされているコレクションのタイプまたは検査されているオブジェクトのクラスタイプに応じて、プロパティおよびリストシートフォームを条件付きでリサイクルまたは再作成しています。

注:Delphiでは、すべてのコントロールにOwnerプロパティとParentプロパティがありました。コントロールのParentプロパティを変更した場合でも、所有しているコントロールが破棄されたときに、所有者によって破棄されます。

C#では、コントロールがPanelは、たとえばPanel.Parentプロパティを変更することにより、フォームからタブページにプログラムで再割り当てされます。フォームでDispose()を呼び出すと、パネルは破棄されず、タブページでControls.Clear()も呼び出されません。 Panel.Dispose()を直接呼び出しても、そのParentが事前に手動でnullに設定されていない限り、実際には破棄されません。

2
kingsley

機能するチェックを追加しました...

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

それは常に真実ですが、フォームはそれなしでエラーをスローします。ところで、私のハンドルは約490万です

1
xlthim

通常、メモリが不足しているコンピューターに関連しているため、これ以上ウィンドウハンドルを作成できないと思います。通常、この時点でもウィンドウは奇妙な動作を示し始めます。

1
AtliB

明らかに多すぎるハンドル(メモリリークの問題):

ITジャングル:System.ComponentModel.Win32Exception:ウィンドウハンドルの作成エラー

0
user344760

私はアプリケーションで同じエラーが発生しました。単一のページに多くのコントロールをロードしています。ボタンクリックイベントでコントロールをクリアしています。コントロールをクリアしてもメモリからコントロールが解放されないため、メモリからコントロールを破棄しますcontrols.clear()メソッドにコメントし、コントロールを破棄するコードを数行追加しました。このようなもの

controlcollectionのコントロールとしての各ctlについて

ctl.dispose()

0
honey0987