我正在寻找一个来自之后>>窗口最大化或最小化的窗体中的事件。
据我所知,有一些事件如SizeChanged或WndProc可以处理最大化的窗口,但是在用户尝试最大化窗口后立即调用它,并且在窗口完全最大化后不会调用它。
我正在寻找像ResizeEnd这样的事件,但也许这个被称为MaximizedEnd或MinimizedEnd
有没有这样做?
答案 0 :(得分:6)
我认为这很简单:
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(...)
替换为您的代码。
答案 1 :(得分:2)
使用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用于通过鼠标拖动调整大小,调整大小用于更改windowState,例如最大化或恢复。我认为重写WndProc()是好的,但是在winform调整大小之前它被解雇了......
答案 2 :(得分:1)
这就是加布里埃尔的解决方案的详细内容。我认为WindoStateChanged也没有事件。
我刚刚测试了这个解决方案,当你点击最大化按钮时它正在工作。它似乎被解雇了3次。我可能会做一些调试,并弄清楚你想拦截什么m.Msg以检查状态是否已经改变。我在这里http://www.autohotkey.com/docs/misc/SendMessageList.htm找到了一些WM_消息的快速参考。
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
}
答案 3 :(得分:0)
这可能不是您正在寻找的答案,但在窗口最大化后没有为Windows窗体定义的事件。如果要查找任何事件,您必须自己进入消息循环。通常,如果我想知道用户是否最大化窗口但不关心更改的大小,我会保存windowstate
,如果它在SizedChanged
上更改,我可以说窗口已最大化。
答案 4 :(得分:0)
我认为我们应该覆盖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);
}
答案 5 :(得分:0)
我知道这是一个老话题,但是也许有人在寻找答案时会发现它。
您可以创建自己的自定义事件来完成您想要的事情。
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