1

これでウィンドウをドラッグしようとすると、ウィンドウがジャンプしてちらつきます。

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_MOVE)
    {
        int x = (m.LParam.ToInt32() & 0xffff);
        int y = ((m.LParam.ToInt32() >> 16) & 0xffff);

        if (x < 500)
            Location = new Point(0, y);
        else
            base.WndProc(ref m);
    }
    else
        base.WndProc(ref m);
}
  • ジャンプをやめなければならない
  • WM_MOVEWM_MOVINGWM_WINDOWPOSCHANGINGまたはその他の移動イベントは、すべての新しい位置をチェックする必要があるため、ウィンドウをドラッグしている間も発生し続ける必要があります。
  • 別の問題はLocation = new Point(0, y);、別の移動イベントを発生させることです (これは無視する必要があります)。

助けてください!

4

2 に答える 2

3

WM_WINDOWPOSCHANGING を使用して WINDOWPOS 構造を変更する例を次に示します。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public struct WINDOWPOS
    {
        public IntPtr hwnd;
        public IntPtr hwndInsertAfter;
        public int x;
        public int y;
        public int cx;
        public int cy;
        public uint flags;
    }

    public const int WM_WINDOWPOSCHANGING = 0x46;

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_WINDOWPOSCHANGING:
                WINDOWPOS wp = (WINDOWPOS)System.Runtime.InteropServices.Marshal.PtrToStructure(m.LParam, typeof(WINDOWPOS));
                if (true) // ... if somecondition ...
                {
                    // modify the location with x,y:
                    wp.x = 0;
                    wp.y = 0;
                }
                System.Runtime.InteropServices.Marshal.StructureToPtr(wp, m.LParam, true);
                break;
        }

        base.WndProc(ref m);
    }

}
于 2013-06-06T15:21:46.570 に答える