我正在从窗口最大化或最小化后调用的表单中寻找一个事件。
据我所知,有诸如 SizeChanged 或 WndProc 之类的事件可以处理最大化的窗口,但是在用户尝试最大化窗口后立即调用它,并且在窗口完全最大化后不会调用它。
我正在寻找像 ResizeEnd 这样的事件,但也许这个事件被称为 MaximizedEnd 或 MinimizedEnd
有没有办法做到这一点?
我正在从窗口最大化或最小化后调用的表单中寻找一个事件。
据我所知,有诸如 SizeChanged 或 WndProc 之类的事件可以处理最大化的窗口,但是在用户尝试最大化窗口后立即调用它,并且在窗口完全最大化后不会调用它。
我正在寻找像 ResizeEnd 这样的事件,但也许这个事件被称为 MaximizedEnd 或 MinimizedEnd
有没有办法做到这一点?
我认为这很简单:
protected override void OnSizeChanged(EventArgs e) {
if (this.WindowState == FormWindowState.Maximized) {
MessageBox.Show("Max!");
}
base.OnSizeChanged(e);
}
在调整窗口大小后不确定您的意思。这也可能有效:
protected override void OnSizeChanged(EventArgs e) {
if (this.WindowState == FormWindowState.Maximized) {
this.BeginInvoke(new MethodInvoker(delegate { MessageBox.Show("Maxed"); }));
}
base.OnSizeChanged(e);
}
MessageBox.Show(...)
用您的代码替换。
使用 resize、resizeBegin 和 resizeEnd 事件有利于在 winform 调整大小后做一些事情。
private bool resize_flag = true;
private void Form1_Resize(object sender, EventArgs e)
{
if (!resize_flag) return;
//your code here
resize_flag = true;
}
private void Form1_ResizeBegin(object sender, EventArgs e)
{
resize_flag = false;
}
private void Form1_ResizeEnd(object sender, EventArgs e)
{
//your code here
resize_flag = true;
}
这段代码很简单,但它有效!resizeEnd 用于通过鼠标拖动调整大小,resize 用于更改窗口状态,例如最大化或恢复。我认为覆盖 WndProc() 很好,但是在调整 winform 大小之前它被解雇了,所以......
这就是 Gabriel 的解决方案的详细信息。我认为 WindoStateChanged 也没有事件。
我刚刚测试了这个解决方案,当您单击最大化按钮时它正在工作。不过,它似乎被解雇了 3 次。我可能会做一些调试,并弄清楚你想要拦截的 m.Msg 到底是什么,以检查状态是否已经改变。我在这里找到了一些 WM_ 消息的快速参考http://www.autohotkey.com/docs/misc/SendMessageList.htm。
protected override void WndProc(ref Message m)
{
FormWindowState previousWindowState = this.WindowState;
base.WndProc(ref m);
FormWindowState currentWindowState = this.WindowState;
if (previousWindowState != currentWindowState && currentWindowState == FormWindowState.Maximized)
{
// TODO: Do something the window has been maximized
}
}
如前所述,在我进行测试时,上述代码至少被触发了 3 次。下面的代码只被触发一次。它有点冗长,但也可能更直观,更全面地解决了您关于如何触发事件的问题。感谢 Yore 对您提出的这个想法的问题的评论。
public Form1()
{
InitializeComponent();
this.SizeChanged +=new EventHandler(Form1_SizeChanged);
FormMaximized += new EventHandler(Form1_FormMaximized);
_CurrentWindowState = this.WindowState;
if (_CurrentWindowState == FormWindowState.Maximized)
{
FireFormMaximized();
}
}
public event EventHandler FormMaximized;
private void FireFormMaximized()
{
if (FormMaximized != null)
{
FormMaximized(this, EventArgs.Empty);
}
}
private FormWindowState _CurrentWindowState;
private void Form1_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Maximized && _CurrentWindowState != FormWindowState.Maximized)
{
FireFormMaximized();
}
_CurrentWindowState = this.WindowState;
}
void Form1_FormMaximized(object sender, EventArgs e)
{
//TODO Put you're code here
}
我认为我们应该覆盖 wndProc 并触发 WM_SYSCOMMAND 事件。
protected override void WndProc(ref Message m)
{
if ((UInt32)m.Msg == Constant.WM_SYSCOMMAND)
{
switch ((UInt32)m.WParam)
{
case Constant.SC_MAXIMIZE:
case Constant.SC_RESTORE:
default:
break;
}
}
base.WndProc(ref m);
}
这可能不是您正在寻找的答案,但在窗口最大化后调用的 Windows 窗体没有定义的事件。如果有任何事件要查找,您必须自己进入消息循环。一般来说,如果我想知道用户是否最大化了窗口但不关心大小被改变,我会保存它windowstate
,如果它改变了,SizedChanged
我可以说窗口被最大化。
我知道这是一个旧线程,但也许有人在寻找答案时会发现这个。
您可以创建自己的自定义事件来完全按照您的意愿行事。
Public Event Maximized(sender As Object, e As EventArgs)
Private Sub frmMain_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd
If Me.WindowState = FormWindowState.Maximized Then RaiseEvent Maximized(sender, Nothing)
End Sub
Private Sub frmMain_Maximized(sender As Object, e As EventArgs) Handles Me.Maximized
End Sub
或者
Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AddHandler Me.Maximized, AddressOf MaximizedEventMethod
End Sub
Private Sub MaximizedEventMethod(sender As Object, e As EventArgs)
'add your code here
End Sub