Есть ли способ отключить окна сообщений в MFC? - PullRequest
2 голосов
/ 29 июня 2011

У меня есть приложение MFC (использующее устаревшую библиотеку, которую я не могу изменить). Когда приложение запускается, оно загружает пару драйверов и показывает окна сообщений, если некоторые драйверы не могут быть загружены. Загрузка драйверов и отображение окон сообщений осуществляется с помощью метода внутри библиотеки, который нельзя изменить (назовем этот метод Init). Я хотел бы отключить эти окна сообщений (чтобы они не «всплывали»). Могу ли я позвонить перед вызовом Init, чтобы временно отключить окна сообщений, а затем снова включить их?

(Обратите внимание, что если после этого невозможно будет повторно включить их, я вполне могу с этим смириться, в основном я хочу их отключить)

Спасибо всем,

Примечание: если кто-то задается вопросом, почему я хотел бы это сделать, это потому, что мое приложение предоставляет интерфейс COM и будет использоваться другими приложениями. Единственная причина, по которой это приложение, заключается в том, что библиотека, которую я использую, намного проще в использовании при создании приложения MFC (а не DLL). Когда он вызывается другими моими приложениями, я не хочу, чтобы отображались окна сообщений, я просто хочу получить ошибки, если что-то пойдет не так.

Ответы [ 3 ]

6 голосов
/ 29 июня 2011

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

Я установил ловушку для захвата окон сообщений перед всплывающим:

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

Новыйпроцедура подключения (CbtHookProc) будет выглядеть следующим образом:

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); 
}

из документация для Microsoft для HCBT_CREATEWND:

Если процедура подключения возвращает ненулевое значение,система разрушает окно

Затем после вызова Init вы можете убрать хук, и снова появятся окна с сообщениями:

            ::UnhookWindowsHookEx(hMessageBoxHook_);
            hMessageBoxHook_ = 0;

Как я уже говорил, я не могу гарантировать, что это работаетно попробуй.

1 голос
/ 29 июня 2011

Один из способов сделать это - перехватить / отсоединить вызовы на MessageBox / MessageBoxEx / и т.д.и просто ничего не делать, когда эти звонки сделаны.Проверьте это руководство для получения подробной информации о перехвате вызовов API.В вашем случае я бы специально рассмотрел метод Import Address Table, который довольно прост в реализации и позволяет вам достичь желаемой функциональности.

Возможно, вы также захотите проверить собственные обходы Microsoft библиотека, но я не уверен, поддерживает ли она замену функциональности вызовов API.

Надеюсь, это поможет.

0 голосов
/ 29 июня 2011

У меня была такая же проблема при использовании ODBC с MFC. Каждый раз, когда возникала ошибка, появлялось окно с сообщением об ошибке, что было бы неплохо, если бы я ее хотел.

Однако, если я этого не сделал, мне нужно было только окружить его:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...