2

WTL モーダル ダイアログを表示する Edit() メソッドを実装する COM コンポーネント (dll) を開発しました。

この COM コンポーネントへの完全なインターフェイスは、化学プロセス業界で使用されているソフトウェア標準 (CAPE-OPEN) に対応しており、その結果、この COM コンポーネントは、私が制御できないさまざまなサードパーティの実行可能ファイルで使用できるようになっています。

私のコンポーネントは、これらの EXE の多くで期待どおりに動作しますが、特に 1 つの場合、ダイアログが表示されずに Edit() メソッドがハングします。

::MessageBox()ただし、ダイアログが表示される直前に呼び出しを行うと、DoModal()最初に MessageBox を表示した後に正しく動作します。

この問題は、この特定の EXE が「隠しウィンドウ アプリケーション」として実行されていることに関係している可能性があるのではないかと疑っています。

::GetConsoleWindow()ダイアログの親としてNULL と戻り値の両方を使用しようとしましたが、どちらも機能しませんでした。

ダイアログ自体は ATL/WTL CPropertySheetImpl です。

問題の親アプリケーション (EXE) は、(やや敵対的な) サード パーティによって開発されているため、私の手に負えません。

::MessageBox()COM コンポーネントから標準の Windows ファイル ダイアログを正常に呼び出したり、表示したりできることはわかっています。実行後、カスタム ダイアログを表示できるようになります。最初に「標準」ダイアログを表示しないと、カスタム ダイアログを表示できません。

不要な MessageBox を最初に表示せずにダイアログを表示する方法を誰かが提案できますか? この EXE が同じインターフェイスに対応する他の COM コンポーネントからのダイアログを表示するのを見たので、それが可能であることはわかっています。

4

5 に答える 5

1

これは信頼できるものではありませんが、::GetDesktopWindow() を親として試してください (HWND を返します)。

注意してください - アプリがクラッシュすると、デスクトップがダウンします。しかし、私はそれが機能するかどうかに興味があります。

于 2008-09-01T14:02:16.957 に答える
1

私が間違っていたことが判明しました:

  • NULL の親でダイアログを作成すると、ダイアログが表示されず、親アプリケーションがハングします
  • ただし、::GetConsoleWindow() を親としてダイアログを作成すると、ダイアログが表示されます。親アプリを起動したアプリのウィンドウの後ろに表示されていたので騙されただけ

だから今、私は自分のダイアログを前面に出す方法を見つけなければなりません。

答えてくれてありがとう;-)

于 2008-09-01T14:12:12.457 に答える
1

ダイアログの親を使用していますか? 例えば

MyDialog dialog(pParent);
dialog.DoModal();

その場合は、親を削除してみてください。特に親がデスクトップ ウィンドウの場合。

于 2008-09-01T13:32:06.610 に答える
1

「隠しウィンドウ」アプリの動作によっては、ウィンドウを表示できない場合があります。たとえば、サービスには「メイン メッセージ ループ」がないため、その過程でウィンドウに送信されたメッセージを処理できません。つまり、ウィンドウを表示するアプリケーションは次のようになります。

    while(GetMessage(&msg, NULL, 0, 0))
    {
        if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

WinMain で。

于 2008-09-01T13:35:22.607 に答える
0

何をするにしても、デスクトップ ウィンドウをモーダル ダイアログ ボックスの親として使用しないでください。

説明については、http: //blogs.msdn.com/b/oldnewthing/archive/2004/02/24/79212.aspxを参照してください。

根拠を引用するには:

まとめると、モーダル ダイアログの所有者がデスクトップの場合、デスクトップは無効になり、その子孫はすべて無効になります。つまり、システム内のすべてのウィンドウを無効にします。あなたが表示しようとしているものでも!

于 2011-03-09T09:18:40.557 に答える