Только что решил данную проблему на C#. Решение основано на перехвате сообщения WM_GETMINMAXINFO:
private const long WM_GETMINMAXINFO = 0x24;
public struct POINTAPI
{
public int x;
public int y;
}
public struct MINMAXINFO
{
public POINTAPI ptReserved;
public POINTAPI ptMaxSize;
public POINTAPI ptMaxPosition;
public POINTAPI ptMinTrackSize;
public POINTAPI ptMaxTrackSize;
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_GETMINMAXINFO)
{
MINMAXINFO mmi = (MINMAXINFO)m.GetLParam(typeof(MINMAXINFO));
mmi.ptMinTrackSize.x = this.szFullScreen.Width;
mmi.ptMinTrackSize.y = this.szFullScreen.Height;
System.Runtime.InteropServices.Marshal.StructureToPtr(mmi, m.LParam, true);
}
}
перед тем как изменять размер окна, в szFullScreen заношу нужный размер окна.
Весь смысл решения в том, что мы указываем минимальный размер окна.
На С++ эта задача решается аналогичным способом