gpt4 book ai didi

.net - WPF 中的 Window StateChanging 事件

转载 作者:行者123 更新时间:2023-12-04 00:59:36 27 4
gpt4 key购买 nike

我需要在 WPF 应用程序最小化之前处理它,而不是在它已经存在时。
我在 Window 对象 StateChanged 上找到了,但是当 Window 对象已经处于最小化状态时它会触发,那么为时已晚。

所以,我需要像“StateChanging”这样的事件来处理,而 Window 对象仍处于以前的状态。

是否有可能创建这样的事件?

最佳答案

在使用 Spy++ 最小化之前找到在窗口上调用的 Windows 消息。第一个被调用的是 WM_WINDOWPOSCHANGING。
我不知道 Windows 在最小化寡妇时正在 -32000、-32000 位置点移动窗口,这些是 WM_WINDOWPOSCHANGING 中的参数。不过,我只在 Vista 上测试过。 http://blogs.msdn.com/oldnewthing/archive/2004/10/28/249044.aspx

此处使用的代码由 Nir ​​发布 here

这是示例代码

xaml :

<Window x:Class="WindowStateTest2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>

<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Button Click="btnClear_Click" Grid.Row="0" x:Name="btnClear">Clear</Button>

<TextBox Name="txt" VerticalScrollBarVisibility="Visible" Grid.Row="2"></TextBox>
</Grid>
</Window>

C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Interop;
using System.Runtime.InteropServices;

namespace WindowStateTest2
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();

this.StateChanged += new EventHandler(Window1_StateChanged);
this.SourceInitialized += new EventHandler(Window1_SourceInitialized);

}

#region Event handlers

void btnClear_Click(object sender, RoutedEventArgs e)
{
this.txt.Text = string.Empty;
}
void Window1_SourceInitialized(object sender, EventArgs e)
{
AttachWndProc();
}

void Window1_StateChanged(object sender, EventArgs e)
{
if (this.WindowState == WindowState.Minimized)
Console.WriteLine("SC: " + this.WindowState);
}

#endregion

#region Const

private int SYSCOMMAND = 0x0112;
private int SC_MINIMIZE = 0xf020;
private int WINDOWPOSCHANGING = 0x0046;

#endregion

private void AttachWndProc()
{
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
source.AddHook(new HwndSourceHook(WndProc));
}

[StructLayout(LayoutKind.Sequential)]
internal struct WINDOWPOSPARAMS
{
public IntPtr hwnd;
public IntPtr hwndInsertAfter;
public int x;
public int y;
public int cx;
public int cy;
public int flags;
}


private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WINDOWPOSCHANGING)
{
WINDOWPOSPARAMS param = (WINDOWPOSPARAMS)Marshal.PtrToStructure(lParam, typeof(WINDOWPOSPARAMS));
if (param.x == -32000 && param.y == -32000)
{
Output("");

// EVENT WOULD BE RAISED HERE

Output("State before minimize:");
Output(string.Format("CurrentState: {0}", this.WindowState));
Output(string.Format("Location {0} {1}: ", this.Top, this.Left));
Output("");
}
}

// process minimize button
if (msg == SYSCOMMAND && SC_MINIMIZE == wParam.ToInt32())
{
Output("Minimize clicked");
}

handled = false;
return IntPtr.Zero;
}

public void Output(object output)
{
this.txt.Text += output.ToString();
this.txt.Text += Environment.NewLine;
}

}
}

关于.net - WPF 中的 Window StateChanging 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/926758/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com