Ich erstelle Nachrichtenfenster von meiner Konsolenanwendung. Die Fensterklasse wird korrekt registriert und das Fenster wird korrekt erstellt, es hat jedoch nie einen Titel (während mein Funktionsaufruf createwindow einen Titel angibt). Haben Sie nachgedacht, können Konsolenprogramme Fenster mit Namen erstellen? Googelte es, fand nichts. Dies ist mein Code, auf ein Minimum beschränkt:Erstellte Fenster haben keinen Titel
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;
}
Ausgang:
class registered. Hinstance : 00E40000
created window
Überprüfung mit Nirsoft des Winlister besteht das Fenster, hat die richtige Klasse ("EME.LauncherWnd"), sondern hat kein Name. Darüber hinaus können diese Zeilen Code im Block hinzu:
if (0 == SetWindowText(hwind2, "aTitle"))
cout << "couldn't set a title" << endl;
else
cout << "title set " << endl;
Der Ausgang ist
title set
Und doch ist das Fenster noch keinen Titel. Wenn das Konsolenprogramm keinen Titel hätte, würde ich annehmen, dass der Aufruf von SetWindowText 0 zurückgeben würde. Was mache ich falsch? Edit: Hinzufügen von pWndProc angefordert als
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;
}
}
Obwohl nach dem Kommentar des pWndProc Hinweis auf (dem Körper, ich war mit dem Bau des Fensters irrelevant gedacht), stellt sie diese Codezeile in dem Schalter als Standard Einfügen aus Fall
return DefWindowProc(hwnd, Msg, wParam, lParam);
löst das Problem.
"* können Konsolenprogramme Fenster mit Namen erstellen? *" - ja, natürlich. Die Konsole selbst ist schließlich nur eine gewöhnliche Win32-App. Konsolen-Apps haben vollen Zugriff auf die Win32-API. Was bedeutet 'pWndProc' genau und verarbeitet Fenstermeldungen korrekt? –
u nead eine Massage-Schleife –
Voting zu schließen als fehlende reproduzierbare Beispiel. –