Как я могу заменить команду кнопки свертывания? - PullRequest
1 голос
/ 03 марта 2010

Во-первых, извините за мой плохой английский:)
Во-вторых, я могу знать, когда форма была перемещена / изменена в размере, используя этот код:

    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;
}

Любая помощь?

Ответы [ 2 ]

2 голосов
/ 03 марта 2010

Вы получаете WM_SYSCOMMAND, когда пользователь нажимает одну из кнопок в строке заголовка: http://msdn.microsoft.com/en-us/library/ms646360(VS.85).aspx

1 голос
/ 03 марта 2010

Вы можете перехватить WM_SYSCOMMAND, переопределив WndProc (). Но это также легко сделать с помощью обработчика события 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
            //..
        }
    }
}
...