WND: Minimize, Maximize, Sysmenu, etc. sperren (nach Erstellung)
-
MSDN schrieb:
If you have changed certain window data using SetWindowLong, you must call SetWindowPos to have the changes take effect. Use the following combination for uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED.
-
-King- schrieb:
MSDN schrieb:
If you have changed certain window data using SetWindowLong, you must call SetWindowPos to have the changes take effect. Use the following combination for uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED.
Bringt leider auch nichts. Ich glaube es liegt daran, dass das Konsolenfenster selbst in ihrer WndProc das wieder zurücksetzt. Also will ich meine WndProc einsetzen:
SetWindowLong(itsHWnd,GWL_WNDPROC,ConWndProc);
Das gibt mir aber nur den schönen Fehler:
Konvertierung des Parameters 3 von 'long (struct HWND__ *,unsigned int,unsigned int,long)' in 'long' nicht moeglich
Hab mich bisher mit Funktionspointern noch nicht auseinandergestzt - was mach ich falsch?
MfG SideWinder
-
SetWindowLong(itsHWnd,GWL_WNDPROC,(LONG)ConWndProc);
-
flenders schrieb:
SetWindowLong(itsHWnd,GWL_WNDPROC,(LONG)ConWndProc);
Will auch nicht.
Liegt das vielleicht daran, dass ConWndProc eine private Methode dieser Klasse ist?
MfG SideWinder
-
Achso. SetWindowLong funktioniert nicht mit dem Konsolenfenster.
-
TIPP schrieb:
Achso. SetWindowLong funktioniert nicht mit dem Konsolenfenster.
Wo steht das? In der MSDN kann ich keinen Hinweis dazu finden.
MfG SideWinder
-
Steht nirgendwo. Aber ich habe es selber ausprobiert und GetLastError() lieferte immer "ungültiger Index" zurück.
-
Aber was für Style hast du eigentlich bei der ersten Variante genommen? Ich denke, da liegt eher der Fehler
Zu WndProc in einer Klasse findest du was in den FAQ -> static
-
warum darf der User das Konsolen-Fenster eigentlich nicht in der Größe ändern?
-
flenders schrieb:
Aber was für Style hast du eigentlich bei der ersten Variante genommen? Ich denke, da liegt eher der Fehler
Zu WndProc in einer Klasse findest du was in den FAQ -> staticDer Block sieht nun so aus:
SetWindowLong(itsHWnd,GWL_STYLE,WS_BORDER|WS_VISIBLE); SetWindowLong(itsHWnd,GWL_WNDPROC,(LONG)ConWndProc); SetWindowPos(itsHWnd,NULL,itsPosOnScreen.get_x(),itsPosOnScreen.get_y(),itsSize.get_x(),itsSize.get_y(),SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED);
itsPosOnScreen und itsSize sind richtig gefüllt. Und sind beide vom Typ "coordinate" - selber gebaut.
MfG SideWinder
-
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