ウィンドウが最大化または最小化された後に呼び出されるフォームからイベントを探しています。
私の知る限り、最大化されたウィンドウを処理できる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は最大化や復元などのwindowStateの変更用です。WndProc()をオーバーライドするのは良いことだと思いますが、winformのサイズが変更される前に起動されるので...
これは、ガブリエルのソリューションが詳細にどのように見えるかです。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
}
これはあなたが探している答えではないかもしれませんが、ウィンドウが最大化された後に呼び出されるWindowsフォームの定義されたイベントはありません。見つけるイベントがある場合は、自分でメッセージループに入る必要があります。一般に、ユーザーがウィンドウを最大化したかどうかを知りたいが、サイズの変更を気にしないwindowstate場合は、を保存します。サイズが変更された場合SizedChangedは、ウィンドウが最大化されたと言えます。
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);
}
私はこれが古いスレッドであることを知っていますが、おそらく誰かが答えを探しているときにこれを見つけるでしょう。
独自のカスタムイベントを作成して、必要なことを正確に実行できます。
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