Как определить событие двойного щелчка захвата размера?

Я ищу способ обнаружить двойной щелчок по ручке размера окна, но, похоже, нет ни одного события щелчка для ручки размера или какого-либо события, связанного с ним вообще. Угадывание размера области захвата и того, действительно ли пользователь нажимает нужную область, является излишне сложной задачей. Но, может быть, есть какие-то другие способы определить, находится ли курсор на ручке размера формы, кроме свойств winform по умолчанию?

Есть ли простой способ узнать, когда пользователь дважды щелкает ручку размера формы?


person user1306322    schedule 14.02.2014    source источник
comment
Ручка размера не находится в клиентской области, а форма окна не предоставляет события для ввода с помощью мыши, кроме кнопки управления. поэтому вы не можете получить какое-либо событие для захвата формы. Да, вы можете сделать это, используя некоторые Windows API с помощью мыши. но вы должны определить, нажала ли ваша мышь на рукоятку или нет. потому что Mouse Hook будет работать для всего экрана, а не для конкретного объекта.   -  person Shell    schedule 14.02.2014
comment
Ну, Windows каким-то образом знает, когда вы щелкаете и перетаскиваете эту ручку, так что должен быть какой-то способ.   -  person user1306322    schedule 14.02.2014
comment
Windows также предоставляет контекстное меню, когда вы щелкаете правой кнопкой мыши по строке заголовка. может получить к нему доступ? может есть какой-то способ получить это. но без Windows API я думаю, что это невозможно.   -  person Shell    schedule 14.02.2014


Ответы (1)


Тебе надо:

  1. Настройте способ получения события двойного щелчка мыши в неклиентской области формы.
  2. Определите хитбокс, в котором вы хотите реагировать на это событие.
  3. Реагируйте на событие, когда оно находится в вашем хитбоксе.

Для этого переопределите метод формы WndProc:

    protected override void WndProc(ref Message m)
    {
        const Int32 WM_NCLBUTTONDBLCLK = 0xA3;
        if (m.Msg == WM_NCLBUTTONDBLCLK)
        {
            //This is a 16x16 region...define the bounds you want...
            Rectangle hitbox = new Rectangle(this.Right - 16, this.Bottom - 16, 16, 16);
            Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
            if (hitbox.Contains(pos))
                MessageBox.Show("got it");  //react however you like
        }
        base.WndProc(ref m);
    }
person DonBoitnott    schedule 14.02.2014