1

アプリケーションを他のいくつかと統合しようとしています。あるケースでは、次の例外が発生しています。

System.InvalidOperationException was unhandled by user code
Message=SetCompatibleTextRenderingDefault must be called before the first IWin32Window object is created in the application.

この例外は、私がやろうとしているためです:

System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);

また、統合しようとしているアプリケーションは、すでにいくつかの IWin32Window を作成しています。

私は周りを検索しましたSetCompatibleTextRenderingDefault(false)が、すでにIWin32Windowがある場合は基本的に試してはいけません。しかし、私のアプリケーションは他のさまざまなアプリケーションに統合されるため、それぞれのケースで条件が変わります。

今のところ、パラメーターを受け取るようにアプリケーションを変更することを計画しているので、コンテキストに応じて実行するSetCompatibleTextRenderingDefault(false)かどうかを決めることができます。

しかし、代わりに、実行する前に IWin32Window が既に作成されているかどうかを確認できる方法があるかどうかを知りたいですSetCompatibleTextRenderingDefault(false)

これが愚かな質問である場合は申し訳ありませんが、これまで Winforms をあまり扱ったことがありません。

あなたが私に与えることができる助けをいただければ幸いです。

アップデート

最初の回答といくつかのコメントを読んだ後、この問題が発生しているコンテキストはかなり複雑であり、ここで完全に説明することはできません. 私はフィードバックに感謝し、あなたが言っていることを理解しています.

私の質問の精神は、私が追加したコンテキストによって誤解されたと思います.エラーが発生している理由を知っており、それを解決して回避する方法を知っています.

IWin32Window が既に作成されているかどうかを知る方法があるかどうか知りたいのですが?

結局、IWin32Window が既に作成されているために例外が発生しているので、どうすればそれを知ることができるのだろうと思っていました。

再度、感謝します。

4

3 に答える 3

3

Application.SetCompatibleTextRenderingDefault() は、UI を表示するようにプログラムを適切に構成するための1 つの側面にすぎません。正しくセットアップする必要がある、はるかに重要なものがあります。DLL では処理できない種類の初期化です。このようなプログラムのメイン スレッドを、EXE の Main() エントリポイントの [STAThread] 属性によって構成された STA スレッドにすることが非常に重要です。ウィンドウを維持するには、Application.Run() メッセージ ループをポンピングする必要があります。この呼び出しは、スレッドで 1 回しか実行できません。

EXE が実行しなければならない義務は、DLL によって確実に実行することはできません。別の UI スレッドを開始することも可能ですが、それだけの価値よりも多くの問題を引き起こす良い方法です。

于 2013-05-10T15:34:29.227 に答える
0

IWin32Window が自分のコンテキストで既に作成されているかどうかを知る方法はありません (フレームワークでは提供されません)。

唯一可能な回避策は、Winforms フォームから継承する独自のカスタム フォームを持つことです。そうすれば、フォームが作成されているときに取得できます。

私のアプリは他の多くのアプリと統合されており、それらすべてに Windows フォーム以外の使用を強制することはできなかったので、それはできません。

設定することにより:

System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);

統合しているアプリケーションに時間を節約しようとしていましたが、このエラーが発生し始めたときにコードを削除し、互換性設定を構成するコードを修正しました.

于 2013-11-14T17:33:51.567 に答える