1

まず、下手な英語で申し訳ありません:)
次に、次のコードを使用して、フォームがいつ移動/サイズ変更されているかを知ることができます:

    protected override void WndProc(ref Message m)
    {

        if (m.Msg == WM_WINDOWPOSCHANGING)
        {
            WINDOWPOS winPos = new WINDOWPOS();
            winPos = (WINDOWPOS)Marshal.PtrToStructure(m.LParam, typeof(WINDOWPOS));

            //Here I just need to change the values of the WINDOWPOS structure

            Marshal.StructureToPtr(winPos, m.LParam, true);
        }
    }

WM_WINDOWPOSCHANGING メッセージは、ユーザーがウィンドウを最小化または最大化しているときにも送信されます。しかし、ユーザーが移動/サイズ変更ではなく、最大化/最小化を行っていることをどのように知ることができますか? WindowState プロパティを取得しようとしましたが、うまくいきませんでした :(
WINDOWPOS 構造体のコードは次のとおりです。

[StructLayout(LayoutKind.Sequential)]
public struct WINDOWPOS
{
    public IntPtr hwnd;
    public IntPtr hwndInsertAfter;
    public int x;
    public int y;
    public int cx;
    public int cy;
    public int flags;
}

何か助けはありますか?

4

2 に答える 2

2

WM_SYSCOMMANDユーザーがタイトル バーのボタンの 1 つをクリックすると取得されます: http://msdn.microsoft.com/en-us/library/ms646360(VS.85).aspx

于 2010-03-03T17:17:16.987 に答える
1

WndProc() をオーバーライドすることで、WM_SYSCOMMAND をトラップできます。ただし、Resize イベントのイベント ハンドラーを使用して簡単に行うこともできます。

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        mPrevState = this.WindowState;

    }
    FormWindowState mPrevState;
    protected override void OnResize(EventArgs e) {
        base.OnResize(e);
        if (mPrevState != this.WindowState) {
            mPrevState = this.WindowState;
            // Do something
            //..
        }
    }
}
于 2010-03-03T18:19:01.683 に答える