WND: Minimize, Maximize, Sysmenu, etc. sperren (nach Erstellung)
-
Ich hab nochmal ein kleines Testprogramm geschrieben:
#define _WIN32_WINNT 0x0500 #include <windows.h> LRESULT CALLBACK ConsoleProc(HWND Window, UINT Message, WPARAM wParam, LPARAM lParam) { return DefWindowProc(Window, Message, wParam, lParam); } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT) { AllocConsole(); HWND ConsoleWindow = GetConsoleWindow(); if(ConsoleWindow == NULL) { MessageBox(NULL, TEXT("ConsoleWindow == NULL"), NULL, MB_OK); } if(SetWindowLongPtr(ConsoleWindow, GWLP_WNDPROC, (LONG_PTR) ConsoleProc) == 0) { TCHAR ErrorMessage[256]; wsprintf(ErrorMessage, TEXT("SetWindowLongPtr failed! GetLastError(): %d"), GetLastError()); MessageBox(NULL, ErrorMessage, NULL, MB_OK); } }
GetLastError(): 1413 -> Ungültiger Index.
-
ich denke du solltest eher die Style mit GetWindowLong(Ptr) auslesen, die entsprechenden Flags löschen und dann wieder setzen.
btw: Bei SetWindowPos brauchst du dich bei dieser Flagkombination nicht groß um Position und Größe kümmern - 0 tut's auch - wird ja ignoriert
-
Ich habe als letzten Fehler:
87 The parameter is incorrect. ERROR_INVALID_PARAMETER
MfG SideWinder
-
Ach, hier steht auch noch was dazu:
-
Bei welchem Aufruf?
-
flenders schrieb:
Bei welchem Aufruf?
Zum falschen Zeitpunkt GetLastError() abgefragt - nein bekomme nun auch 1413.
Wie kann ich das nun anders lösen? Es ist übrigens keine Win-Anwendung die eine Konsole alloziert sondern eine Konsolenanwendung.
Wenn alle Stricke reißen muss ich die Std-Konsole löschen und ein eigenens Fenster mit dem Verhalten der Konsole basteln *omfg* HILFE!
MfG SideWinder
-
Es ist übrigens keine Win-Anwendung die eine Konsole alloziert sondern eine Konsolenanwendung.
ist im endeffekt genau das gleiche. die konsole wird vom compiler auch mit AllocConsole erstellt.
-
Wenn ich diese Aufrufe lösche bekomme ich übrigens immer noch einen Fehler:
183 Cannot create a file when that file already exists. ERROR_ALREADY_EXISTS
Ich erstelle allerdings nirgends eine Datei - was hat das schon wieder zu bedeuten?
MfG SideWinder
-
Frag die Werte nur direkt nach dem Aufruf der API-Funktion (die SetLastError benutzen) auf, sonst nützt dir der Wert nichts.
-
Wenn ich bis morgen keine Lösung gefunden habe werde ich wohl die Konsole selsbt progammieren:
- FreeConsole()
- Eigenenes Fenster erstellen - diesmal gleich mit den nötigen Werten füllen
- Gleiches aussehen beibehalten
- Jeglichen Output wird über meine Konsolenklasse gemacht -> cout funktioniert nicht mehr(hat da jemand eine Idee?)
- Jeglichen Input durch die ConWndProc in einen Puffer mit INPUT_RECORD schreiben auf den kann man ja einen HANDLE holen den ich dann statt STD_INPUT_HANDLE zB CON_INPUT_HANDLE nennen könnte.
- Eine Funktion AllocConsole() so schreiben, dass jeder Prozess meine Konsole laden kann da sie ja ansonsten keinen Sinn machtUhje das wird noch einmal soviel Arbeit wie bisher
MfG SideWinder
-
void main schrieb:
Frag die Werte nur direkt nach dem Aufruf der API-Funktion (die SetLastError benutzen) auf, sonst nützt dir der Wert nichts.
Mach ich ja: Nach SetWindowPos()
MfG SideWinder
-
Also gibt es keine Möglichkeit mit der WinAPI über die Konsole komplett die Kontrolle zu übernehmen.
Da bleiben mir nun zwei Möglichkeiten:
- Der User soll einfach die Größe nicht ändern (uhje)
- Ich bau ein eigenes Fenster "Konsolen-Like"Zu zweitens 2 Fragen:
1. Wie kann ich cout/cin umbiegen auf meine Handles auf ScreenBuffers?
2. Wie kann ich aus einem Konsolenprogramm heraus ein Fenster erzeugen? Bisher habe ich es nur als Child geschafft, was mir erst wieder nichts bringt :(.MfG SideWinder
-
Vollkommen egal
- ein Child kann man wenigstens nicht aus dem Konsolenfenster rausschieben und ich habe indirekt trotzdem Kontrolle über den Bereich da ich ja das Childfenster drin habe. Ich verändere bloß die Größe des Fensters innen - was der User draußen mit der Konsole macht ist egal
Juhu hoffentlich geht das alles.
BTW: Falls euch doch noch einfällt wie man das direkt machen kann - immer her damit!
MfG SideWinder
-
Kommt das mit "Ungültiger Index" nur bei GWL_WNDPROC oder auch bei GWL_STYLE?
GetLastError solltest du direkt nach dem zu überprüfenden Funktionsaufruf stehen haben, also direkt nach SetWindowLong
-
flenders schrieb:
Kommt das mit "Ungültiger Index" nur bei GWL_WNDPROC oder auch bei GWL_STYLE?
GetLastError solltest du direkt nach dem zu überprüfenden Funktionsaufruf stehen haben, also direkt nach SetWindowLongBei beiden.
Aber ich werde es jetzt über ein Child-Fenster in der Konsole machen - ich muss nur noch folgendes Problem lösen:
Ich kann keine Messageschleife bauen da sonst der User mehr tun muss als ein Objekt meiner Klasse zu benützen. Also kann ich in der Klasse zwar Fenster erstellen, aber nicht deren Messages abfragen.
Im Prinzip muss WM_DESTROY und WM_PAINT direkt an meine WndProc-Klasse weitergeleitet werden - aber ich weiß nur noch nicht wie :(.
MfG SideWinder