所以我想在程序的这个部分实现速度时,当我的主窗体的窗口状态改变时立即触发一个函数。我需要它像这样:
private void goButton_Click(object sender, EventArgs e)
{
//Code
}
我检查了表单的事件选项卡,没有WindowStateChanged等事件。我该如何做?
由于表单会经常调整大小,所以检查大小是否发生改变并不起作用。
所以我想在程序的这个部分实现速度时,当我的主窗体的窗口状态改变时立即触发一个函数。我需要它像这样:
private void goButton_Click(object sender, EventArgs e)
{
//Code
}
我检查了表单的事件选项卡,没有WindowStateChanged等事件。我该如何做?
由于表单会经常调整大小,所以检查大小是否发生改变并不起作用。
我希望我来派对的时间不算太晚。
我选择实现方式非常直接,不需要分配全局变量,只需在调用base.WndProc
之前和之后检查表单的WindowState
值:
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
}
底线 - 它有效。
您可以尝试重写WndProc
函数,如此链接所建议的那样。
来自帖子:
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
事件并从那里检查窗口状态。但我听说当控件(或表单?)被最大化时,它不会触发。
希望这可以帮助您!
您可以使用此方法从另一个线程更改窗体的状态。该方法适用于 .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
}
}