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

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

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

Поскольку в окне консоли в качестве заголовка указан путь к исполняемому файлу моего приложения, я подумал, что окно каким-то образом связано с моим приложением. Поэтому я передал 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;
}

1 Ответ

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

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

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

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