Windows: окно только для сообщения появляется, когда я перезваниваю из собственного кода в управляемый

После некоторых усилий мне удалось захватить сообщения Windows из сторонней библиотеки MFC (я спросил об этом здесь). Короче говоря, мне пришлось создать окно только для сообщений с циклом сообщений, который перехватывал сообщения сторонних dll.

Указанное окно только для сообщений должно оставаться скрытым. И это действительно так, поскольку я передаю HWND_MESSAGE в CreateWindowEx и вызовите ShowWindow с SW_HIDE. Однако моя dll C++ имеет некоторые обратные вызовы в управляемом коде. И я заметил, что когда я выполняю действия пользователя, которые запускают первое из них, появляется окно консоли. И это не исчезнет, ​​пока я не закрою приложение.

Поскольку в заголовке окна консоли указан путь к исполняемому файлу моего приложения, я подумал, что это окно каким-то образом связано с моим приложением. Поэтому я передал NULL параметру hInstance CreateWindowEx, но это не сработало.

Вот мой код окна только для сообщений:

DWORD WINAPI CDRTech::MessageLoopThread( void * pParams ){
    HWND hwnd;
    MSG mensaje;
    WNDCLASSEX wincl;
    const string windowClass = "DR_TECH_MESSAGE_HANDLER";

    // Window class
    wincl.hInstance = ::GetModuleHandle(NULL);
    wincl.lpszClassName = windowClass.c_str();
    wincl.lpfnWndProc = ::DefWindowProc;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = ::LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = ::LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = ::LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = ::GetSysColorBrush(COLOR_BACKGROUND);
    if(!::RegisterClassEx(&wincl)){
        ::GetErrorLoggerInstance()->Log( LOG_TYPE_ERROR, "CDRTech", "MessageLoopThread", "Could not register Message Handling Window" );
        return 0;
    }

    //Create Window (hidden)
    hwnd = ::CreateWindowEx(
            0,                      //Default ExStyle
            windowClass.c_str(),    //Window class
            "DRTech",               //Window Title
            WS_OVERLAPPEDWINDOW,    //Default Style
            CW_USEDEFAULT,          //Let Windows decide position
            CW_USEDEFAULT,
            10,                     //Width
            10,                     //Height
            HWND_MESSAGE,           //Message-only window
            NULL,                   //No Menu
            NULL,                   //Handle to application
            NULL                    //Window creation data
    );
    ::ShowWindow( hwnd, SW_HIDE );

    CDRTech* pThis = reinterpret_cast<CDRTech*>( pParams );
    pThis->InitDRTechLibrary();
    //Start message loop
    while(TRUE == GetMessage(&mensaje, NULL, 0, 0)){
        TranslateMessage(&mensaje);
        DispatchMessage(&mensaje);
    }
    return mensaje.wParam;
}

person dario_ramos    schedule 07.06.2011    source источник


Ответы (1)


Окно, которое вы создаете, не связано с окном консоли, которое вы видите. Что-то, что вы вызываете, создает окно консоли (или ваша программа помечается как консольное приложение, и в этом случае консоль создается при запуске вашего приложения).

Поставьте точку останова на AllocConsole(), чтобы узнать, кто создает консоль.

person John    schedule 07.06.2011
comment
В моем коде нет вызова AllocConsole(), как мне это сделать? И моя программа - это приложение Windows Forms. - person dario_ramos; 07.06.2011
comment
вы можете поставить точку останова на функции, даже если их нет в вашем коде. В WinDbg вы можете просто ввести bp kernel32!AllocConsole. В Visual Studio нажмите Ctrl+B и введите AllocConsole. Кроме того, если вы используете Visual Studio, обязательно снимите флажок «Показать только мой код». - person John; 07.06.2011