我正在从控制台应用程序中创建消息窗口。窗口类已正确注册并且窗口已正确创建,但它从未有过标题(尽管我的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时,我认为它的主体与窗口的构建无关,但插入以下代码行作为switch case的默认值后,问题得以解决:
return DefWindowProc(hwnd, Msg, wParam, lParam);
解决问题。
pWndProc
指向的确切内容是什么,并且它是否正确处理窗口消息呢? - Remy LebeauDefWindowProc()
函数? - Jonathan Potter