После некоторых усилий мне удалось перехватить сообщения 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;
}