5

ウィンドウが最大化または最小化された後に呼び出されるフォームからイベントを探しています。

私の知る限り、最大化されたウィンドウを処理できるSizeChangedやWndProcなどのイベントがありますが、ユーザーがウィンドウを最大化しようとするとすぐに呼び出され、ウィンドウが完全に最大化された後は呼び出されません。

ResizeEndのようなイベントを探していますが、これはMaximizedEndまたはMinimizedEndと呼ばれている可能性があります

とにかくそれをすることはありますか?

4

6 に答える 6

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(...)を自分のコードに置き換えます。

于 2012-05-04T02:24:11.523 に答える
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はマウスドラッグによるサイズ変更用で、resizeは最大化や復元などのwindowStateの変更用です。WndProc()をオーバーライドするのは良いことだと思いますが、winformのサイズが変更される前に起動されるので...

于 2016-11-22T11:25:40.203 に答える
1

これは、ガブリエルのソリューションが詳細にどのように見えるかです。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回起動されます。以下のコードは1回だけ起動されます。これはもう少し長くなりますが、より直感的で、イベントを発生させる方法に関する質問に完全に対応できる場合もあります。このアイデアに対するあなたの質問へのコメントで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
}
于 2012-05-04T02:02:07.647 に答える
0

これはあなたが探している答えではないかもしれませんが、ウィンドウが最大化された後に呼び出されるWindowsフォームの定義されたイベントはありません。見つけるイベントがある場合は、自分でメッセージループに入る必要があります。一般に、ユーザーがウィンドウを最大化したかどうかを知りたいが、サイズの変更を気にしないwindowstate場合は、を保存します。サイズが変更された場合SizedChangedは、ウィンドウが最大化されたと言えます。

于 2012-05-04T01:45:08.027 に答える
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);
    }
于 2014-08-22T11:56:38.580 に答える
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
于 2019-05-19T12:56:36.713 に答える