Hello, how to catch a window resize event? I mean that there would be certain actions in the window before the WindowState becomes Maximized , regardless of how the WindowState becomes Maximized .
- 3Apparently, only through P / Invoke . - VladD
- Is an event really necessary before changing the window? Maybe everything can be done on the event SizeChanged? - zuev93
- @ zuev93, yes, just before you change the state of the window, you must perform certain actions. - Arthur Edgarov
|
2 answers
private const int WM_SYSCOMMAND = 0x0112; private const int SC_MINIMIZE = 0xF020; public MainWindow() { InitializeComponent(); } [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] private IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case WM_SYSCOMMAND: int command = wParam.ToInt32() & 0xfff0; if (command == SC_MINIMIZE) { //before min } else { //before max } break; } return IntPtr.Zero; } private void Window_SourceInitialized(object sender, EventArgs e) { IntPtr windowHandle = (new WindowInteropHelper(this)).Handle; HwndSource src = HwndSource.FromHwnd(windowHandle); src.AddHook(new HwndSourceHook(WndProc)); } it is better to execute the code inside SourceInitialized inside this event or any other when the window is already initialized because
(new WindowInteropHelper(this)).Handle will issue 0 until it is initialized
- did everything as you wrote, but for some reason the program behaves in a strange way with this code. The point is, I have a
Border, it serves as the top panel of my program, respectively, while the mouse button is held down, theDragMove()function isDragMove(), but with the addition of this code, the window simply turns to full screen with a simple mouse click on thisBorder. See the code below. - Arthur Edgarov - so correctly, I threw you a little garbage, the fact is that not only window deployment will fall down in the else ... in general, here is a link to winUser.h there you can find all the values that wParam math.uiuc.edu/~gfrancis/ illimath / windows / aszgard_mini / bin / MinGW / ... i.e. in this case, you need to declare SC_MAXIMIZE 0xF030 and else to remove it altogether, the window is expanded because you explicitly call WindowState = WindowState.Maximized - Dmitriy
- I instead of
private const int SC_MINIMIZE = 0xF020;madeprivate const int SC_MAXIMIZE = 0xF030;, and wrote everything inif (command == SC_MAXIMIZE) {}, but it does not work for some reason ... Do not tell me what could be the problem? - Arthur Edgarov - And what does not work, the code that should work according to this condition? Point after set int command = wParam.ToInt32 () & 0xfff0; and see what value in the command variable is stored and whether it is SC_MAXIMIZE, at least before I wrote the comments above, I created a test WPF project, everything worked) - Dmitriy
- This is what happened when assigning the value of the variable command: command variable , variable SC_MAXIMIZE . - Arthur Edgarov
|
private const int WM_SYSCOMMAND = 0x0112; private const int SC_MINIMIZE = 0xF020; private void music_SourceInitialized(object sender, EventArgs e) { IntPtr windowHandle = (new WindowInteropHelper(this)).Handle; HwndSource src = HwndSource.FromHwnd(windowHandle); src.AddHook(new HwndSourceHook(WndProc)); } [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case WM_SYSCOMMAND: int command = wParam.ToInt32() & 0xfff0; if (command == SC_MINIMIZE) { } else { border_main.CornerRadius = new CornerRadius(0); border_bottom.CornerRadius = new CornerRadius(0); ResizeMode = ResizeMode.NoResize; WindowState = WindowState.Maximized; } break; } return IntPtr.Zero; } |