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 -> static

    Der 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





  • 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 macht

    Uhje das wird noch einmal soviel Arbeit wie bisher 😞

    MfG SideWinder


Anmelden zum Antworten