@@ -281,6 +281,44 @@ private IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, re
281
281
returnval = UnsafeNativeMethods . DefWindowProc ( hwnd , msg , wParam , new IntPtr ( - 1 ) ) ;
282
282
handled = true ;
283
283
break ;
284
+ case ( int ) Standard . WM . WINDOWPOSCHANGING :
285
+ {
286
+ var pos = ( Standard . WINDOWPOS ) System . Runtime . InteropServices . Marshal . PtrToStructure ( lParam , typeof ( Standard . WINDOWPOS ) ) ;
287
+ if ( ( pos . flags & ( int ) Standard . SWP . NOMOVE ) != 0 )
288
+ {
289
+ return IntPtr . Zero ;
290
+ }
291
+
292
+ var wnd = this . AssociatedObject ;
293
+ if ( wnd == null || this . hwndSource ? . CompositionTarget == null )
294
+ {
295
+ return IntPtr . Zero ;
296
+ }
297
+
298
+ bool changedPos = false ;
299
+
300
+ // Convert the original to original size based on DPI setting. Need for x% screen DPI.
301
+ var matrix = this . hwndSource . CompositionTarget . TransformToDevice ;
302
+
303
+ var minWidth = wnd . MinWidth * matrix . M11 ;
304
+ var minHeight = wnd . MinHeight * matrix . M22 ;
305
+ if ( pos . cx < minWidth ) { pos . cx = ( int ) minWidth ; changedPos = true ; }
306
+ if ( pos . cy < minHeight ) { pos . cy = ( int ) minHeight ; changedPos = true ; }
307
+
308
+ var maxWidth = wnd . MaxWidth * matrix . M11 ;
309
+ var maxHeight = wnd . MaxHeight * matrix . M22 ;
310
+ if ( pos . cx > maxWidth && maxWidth > 0 ) { pos . cx = ( int ) Math . Round ( maxWidth ) ; changedPos = true ; }
311
+ if ( pos . cy > maxHeight && maxHeight > 0 ) { pos . cy = ( int ) Math . Round ( maxHeight ) ; changedPos = true ; }
312
+
313
+ if ( ! changedPos )
314
+ {
315
+ return IntPtr . Zero ;
316
+ }
317
+
318
+ System . Runtime . InteropServices . Marshal . StructureToPtr ( pos , lParam , true ) ;
319
+ handled = true ;
320
+ }
321
+ break ;
284
322
}
285
323
286
324
return returnval ;
@@ -319,7 +357,7 @@ private void HandleMaximize()
319
357
IntPtr monitor = UnsafeNativeMethods . MonitorFromWindow ( this . handle , Constants . MONITOR_DEFAULTTONEAREST ) ;
320
358
if ( monitor != IntPtr . Zero )
321
359
{
322
- var monitorInfo = new MONITORINFO ( ) ;
360
+ var monitorInfo = new Native . MONITORINFO ( ) ;
323
361
UnsafeNativeMethods . GetMonitorInfo ( monitor , monitorInfo ) ;
324
362
325
363
var desktopRect = ignoreTaskBar ? monitorInfo . rcMonitor : monitorInfo . rcWork ;
@@ -433,7 +471,7 @@ private void AssociatedObject_SourceInitialized(object sender, EventArgs e)
433
471
this . AssociatedObject . Invoke ( ( ) =>
434
472
{
435
473
this . AssociatedObject . InvalidateMeasure ( ) ;
436
- RECT rect ;
474
+ Native . RECT rect ;
437
475
if ( UnsafeNativeMethods . GetWindowRect ( this . handle , out rect ) )
438
476
{
439
477
UnsafeNativeMethods . SetWindowPos ( this . handle , new IntPtr ( - 2 ) , rect . left , rect . top , rect . Width , rect . Height , 0x0040 ) ;
0 commit comments