我正在从我的控制台应用程序创建消息窗口。窗口类已正确注册并且窗口已正确创建,但它从不具有标题(而我的createwindow函数调用确实指定了标题)。 让我思考,控制台程序可以创建名称窗口?用Google搜索,什么也没找到。 这是我的代码,保持最低限度:
using namespace std;
hInstance = GetModuleHandle(NULL);
WNDCLASS WndClass = {};
WndClass.style = CS_HREDRAW | CS_VREDRAW; // == 0x03
WndClass.lpfnWndProc = pWndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hIcon = 0;
WndClass.hCursor = 0;
WndClass.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME;
WndClass.lpszMenuName = 0;
WndClass.lpszClassName = "EME.LauncherWnd";
int style = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU | WS_THICKFRAME | WS_CAPTION;
if (RegisterClassA(&WndClass))
{
cout << "class registered. Hinstance : " << hInstance << " style : (expect 0xcf0000) " << std::hex << style << endl;
HWND hwind2 = CreateWindowExA(0, "EME.LauncherWnd", "Mytitle", style, 0x80000000, 0x80000000, 0x80000000, 0x80000000, NULL, NULL, hInstance, NULL);
if (hwind2 == 0)
cout << "Couldn't create window" << endl;
else
cout << "created window" << endl;
}
输出:
class registered. Hinstance : 00E40000
created window
使用Nirsoft的Winlister进行检查,窗口存在,具有正确的类(“EME.LauncherWnd”),但没有名称。 此外,在块中添加以下代码行:
if (0 == SetWindowText(hwind2, "aTitle"))
cout << "couldn't set a title" << endl;
else
cout << "title set " << endl;
输出
title set
然而,窗口仍然没有标题。如果控制台程序没有标题我会假设SetWindowText调用将返回0。 我究竟做错了什么 ? 编辑:按要求添加pWndProc
LRESULT CALLBACK pWndProc(HWND hwnd, // Handle to our main window
UINT Msg, // Our message that needs to be processed
WPARAM wParam, // Extra values of message
LPARAM lParam) // Extra values of message
{
switch (Msg)
{
case WM_DESTROY:
....
break;
}
}
虽然在评论中指出pWndProc(我认为这个主体与窗口的构造无关),但是在切换案例中将这个代码行作为默认值插入
return DefWindowProc(hwnd, Msg, wParam, lParam);
解决了这个问题。
答案 0 :(得分:0)
我发布评论建议的问题答案: 答案是,为了完成窗口创建,传递给RegisterClass的pWndProc WINAPI必须处理默认消息(特别是OS消息)。 在执行CreateWindow期间(在调用开始之后和返回之前),pWndProc函数已经接收到它必须处理的消息,在我的情况下它没有处理它们。 这是标准的pWndProc函数:
LRESULT CALLBACK pWndProc(HWND hwnd, // Handle to our main window
UINT Msg, // Our message that needs to be processed
WPARAM wParam, // Extra values of message
LPARAM lParam) // Extra values of message
{
switch (Msg)
{
case WM_DESTROY:
...
default:
return DefWindowProc(hwnd, Msg, wParam, lParam);
}
}
来源:
窗口过程通常不会忽略消息。如果它不处理消息,它必须将消息发送回系统以进行默认处理。窗口过程通过调用DefWindowProc函数来执行此操作,该函数执行默认操作并返回消息结果。然后,窗口过程必须将此值作为自己的消息结果返回。大多数窗口过程只处理几条消息,并通过调用DefWindowProc将其他消息传递给系统。