2011-06-29 14 views
2

MFCアプリケーションがあります(変更できない従来のライブラリを使用しています)。アプリケーションが起動すると、2つのドライバがロードされ、いくつかのドライバをロードできなかった場合はメッセージボックスが表示されます。ドライバのロードとメッセージボックスの表示は、ライブラリ内の変更できないメソッド(このメソッドをInitと呼ぶ)によって行われます。私はそれらのメッセージボックスを無効にしたい( "ポップ"からそれらを防ぐ)。 Initを呼び出してメッセージボックスを一時的に無効にしてから再度有効にする前に、私が呼び出すことができるものはありますか?誰かが不思議場合:MFCでメッセージボックスを無効にする方法はありますか?

は、すべての

おかげで、

注意を(私は主にそれらを無効にしたい、それが後に再度有効に彼らには不可能であるならば、私は非常によくそれと一緒に暮らすことができることに注意してください)なぜ私はそれをしたいのですか?それは私のアプリケーションがCOMインターフェイスを公開し、他のアプリケーションによって使用されるためです。それがアプリケーションである唯一の理由は、私が使用するライブラリが、MFCアプリケーションを作成するとき(dllではなく)にはるかに使いやすいということです。他のアプリケーションから呼び出されたときに、メッセージボックスが表示されないようにするには、何か問題が生じたときにエラーを出したいだけです。

答えて

6

これが機能するかどうかはわかりません。私はいくつかのメッセージボックスをサブクラス化するためにそれらをポップアップしないようにし、dllからではありません。

私はpoping前にメッセージボックスをキャプチャするフックを設定します。

HHOK hMessageBoxHook_ = SetWindowsHookEx(WH_CBT, 
             &CbtHookProc, 
             ::GetModuleHandle(NULL), 
             GetCurrentThreadId()); 

新しいフックプロシージャ(CbtHookProc)はこのようになります:HCBT_CREATEWNDためmicrosoft documentationから

LRESULT CALLBACK CbtHookProc( int nCode, 
              WPARAM wParam, 
              LPARAM lParam) 
{ 
    if(nCode < 0) 
    { 
     return ::CallNextHookEx( hMessageBoxHook_, 
            nCode, 
            wParam, 
            lParam); 
    } 

    switch(nCode) 
    { 
     case HCBT_CREATEWND: // a window is about to be created 
      return -1; 
    } 

    return ::CallNextHookEx( hMessageBoxHook_, 
           nCode, 
           wParam, 
           lParam); 
} 

フックプロシージャが の非ゼロ値を返した場合、システムはを破棄しますウィンドウ

その後のInitを呼び出した後、あなたがフックを削除することができますし、メッセージボックスが再びポップアップします:

  ::UnhookWindowsHookEx(hMessageBoxHook_); 
      hMessageBoxHook_ = 0; 

私はそれはそれを試してみて動作します保証することはできないことを言ったとおり。

+0

これは完全に機能します!ありがとうございます:) – Carl

+0

それは知っている素敵な作品!どういたしまして! –

0

MFCでODBCを使用する場合、同じ問題がありました。エラーが発生するたびに、エラーを示すメッセージボックスがポップアップ表示されます。私はしなかった場合は、私だけでそれを囲むように必要な

TRY 
{ 
    // Call error-prone method 
} 
CATCH (CException, pEx) 
{ 
    // Free resources 
} 
END_CATCH 

メッセージボックスには、例外を処理する方法を知らないの枠組みから来ています。単にそれをキャッチし、それを望むようにしてください。

+0

助けてくれてありがとうございますが、これは私の問題を解決しません。メッセージボックスは処理されない例外から来るものではなく、エラーをキャッチしてメッセージボックスを表示するライブラリから来ています。可能であれば、ライブラリーが表示できないように今後のメッセージボックスを無効または非表示にしたいと考えています。 – Carl

1

これを行う1つの方法は、MessageBox/MessageBoxEx/etcにコールをフック/アンフックすることです。これらの呼び出しが行われたときには何もしません。フックAPI呼び出しの詳細については、this guideを参照してください。あなたの場合、私は具体的にはImport Address Tableメソッドを見ています。これは実装が非常に簡単で、必要な機能を実現することができます。

また、マイクロソフト自身のDetoursライブラリを確認することもできますが、API呼び出し機能の置き換えをサポートしているかどうかはわかりません。

希望します。

関連する問題