gpt4 book ai didi

c++ - window : Message-only window appears when I call back from native to managed code

转载 作者:行者123 更新时间:2023-11-28 08:19:49 26 4
gpt4 key购买 nike

经过相当多的努力,我设法从第三方 MFC dll 捕获了 Windows 消息(我询问了那个 here)。简而言之,我必须创建一个带有消息循环的纯消息窗口,该消息循环捕获第三方 dll 的消息。

所述仅消息窗口必须保持隐藏。它确实如此,最初,因为我将 HWND_MESSAGE 传递给 CreateWindowEx并调用ShowWindow与 SW_HIDE。但是,我的 C++ dll 对托管代码有一些回调。我注意到,当我执行触发第一个操作的用户操作时,会出现一个控制台窗口。在我关闭我的应用程序之前它不会消失。

由于控制台窗口将我的应用程序的可执行路径作为其标题,我认为该窗口以某种方式与我的应用程序相关联。所以我将 NULL 传递给 CreateWindowEx 的 hInstance 参数,但它没有起作用。

这是我的仅消息窗口代码:

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

最佳答案

您创建的窗口与您看到的控制台窗口无关。您调用的东西会创建一个控制台窗口(或者您的程序被标记为控制台应用程序,在这种情况下,控制台是在您的应用程序启动时创建的)。

AllocConsole() 处放置断点以查找谁在创建控制台。

关于c++ - window : Message-only window appears when I call back from native to managed code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6267596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com