所以我想立即,因为程序的这部分依赖于速度,在我的主窗体中更改windowstate时触发一个函数。我需要它是这样的:
private void goButton_Click(object sender, EventArgs e)
{
//Code
}
我查看了表单的事件选项卡,我没有WindowStateChanged等。我该怎么做?
表单将大量调整大小,因此检查大小更改的时间将不起作用。
答案 0 :(得分:21)
答案 1 :(得分:3)
我希望我的聚会不会太晚。
我选择实现它的方式很简单,并且不需要分配全局变量,只需在调用WindowState
之前和之后检查表单的base.WndProc
值:
protected override void WndProc(ref Message m)
{
FormWindowState org = this.WindowState;
base.WndProc(ref m);
if (this.WindowState != org)
this.OnFormWindowStateChanged(EventArgs.Empty);
}
protected virtual void OnFormWindowStateChanged(EventArgs e)
{
// Do your stuff
}
底线 - 它有效。
答案 2 :(得分:1)
您可以尝试将WndProc
函数覆盖为this link建议。
来自帖子:
protected override void WndProc(ref Message m)
{
if (m.Msg == /*WM_SIZE*/ 0x0005)
{
if(this.WindowState == FormWindowState.Minimized)
{
// do something here
}
}
base.WndProc(ref m);
}
此代码只检查触发Resize
事件时的表单状态。
或者,您可能只是抓住表单的Resize
事件并从那里检查窗口状态。但我听说当控件(或Form?)最大化时它不会触发。
希望这有帮助!
答案 3 :(得分:0)
您可以使用此方法从另一个线程更改窗体的窗口状态。这适用于.Net Framework 3.5
Invoke(new Action(() => { this.WindowState = FormWindowState.Normal; }));
我希望这对你有所帮助。
public partial class Form1 : Form {
private FormWindowState mLastState;
public Form1() {
InitializeComponent();
mLastState = this.WindowState;
}
protected override void OnClientSizeChanged(EventArgs e) {
if (this.WindowState != mLastState) {
mLastState = this.WindowState;
OnWindowStateChanged(e);
}
base.OnClientSizeChanged(e);
}
protected void OnWindowStateChanged(EventArgs e) {
// Do your stuff
}
}