Я создаю окна сообщений из своего консольного приложения. Класс окна зарегистрирован правильно, и окно создается правильно, но оно никогда не имеет названия (в то время как мой вызов функции createwindow указывает заголовок). Подумал, могут ли консольные программы создавать окна с именем? Погубил его, ничего не нашел. Это мой код, сведен к минимуму:Созданные окна не имеют названия
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
Проверка с Winlister NirSoft, в окне существует, имеет право класса ("EME.LauncherWnd"), но имеет без имени. Кроме того, добавление этих строк кода в блоке:
if (0 == SetWindowText(hwind2, "aTitle"))
cout << "couldn't set a title" << endl;
else
cout << "title set " << endl;
Выход
title set
И все же, окно еще не имеет названия. Если консольная программа не могла иметь заголовок, я бы предположил, что вызов SetWindowText вернет 0. Что я делаю неправильно? Edit: Добавление 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 (что тело я думал, не имеет никакого отношения к строительству окна), то получается, вставив эту строку кода по умолчанию в переключателе case
return DefWindowProc(hwnd, Msg, wParam, lParam);
решает проблему.
"* Может ли консольные программы создавать окна с именем? *" - да, конечно. Сама консоль - это просто обычное приложение Win32, afterall. Консольные приложения имеют полный доступ к API Win32. При этом, что именно указывает 'pWndProc', правильно ли он обрабатывает оконные сообщения? –
u nead массажная петля –
Голосование, чтобы закрыть как невоспроизводимый пример. –