C # переопределить WndProc на уровне управления для обнаружения - PullRequest
1 голос
/ 05 мая 2010

Я переопределил WndProc на уровне UserControl для обнаружения MouseDown, MouseUp и MouseMove для любого элемента управления, добавленного в этот UserControl.

protected override void WndProc(ref Message m)
    {
        Point mouseLoc = new Point();

        switch (m.Msg)
        {
            case WM_LBUTTONDOWN:
                System.Diagnostics.Debug.WriteLine("mouse down");
                //this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, mouseLoc.X, mouseLoc.Y, 0));

                break;
            case WM_LBUTTONUP:
                System.Diagnostics.Debug.WriteLine("mouse up");
                //this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, mouseLoc.X,mouseLoc.Y, 0));

                break;
            case WM_MOUSEMOVE:
                int lParam = m.LParam.ToInt32();

                //mouseLoc.X = lParam & 0xFFFF;
                //mouseLoc.Y = (int)(lParam & 0xFFFF0000 >> 16);

                mouseLoc.X = (Int16)m.LParam;
                mouseLoc.Y = (Int16)((int)m.LParam >> 16);

                System.Diagnostics.Debug.WriteLine("mouse move: " + mouseLoc.X + ", " + mouseLoc.Y);

                //this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, mouseLoc.X,mouseLoc.Y, 0));
                break;
        }

        base.WndProc(ref m);
    }

MouseMove, Down и Up работают, когда указатель мыши находится в UserControl, но когда указатель мыши находится на другом элементе управления (внутри моего UserControl), он не работает.

Я что-то не так делаю?

В настоящее время разрабатывается элемент управления движением и прокруткой.

Ответы [ 2 ]

1 голос
/ 05 мая 2010

Так работает Windows - каждый элемент управления в winforms является окном, а сообщения мыши отправляются в окно, в котором они находятся. Если вам нужно получить информацию от мыши из других окон, вам нужно как-то взаимодействовать с ними.

Сказав все это, если все, что вам нужно, это управление щелчком и прокруткой, вам следует рассмотреть возможность использования API-интерфейсов WM_GESTURE - это то, для чего они предназначены, и они позволят вам реализовать щелчок и прокручивать без какого-либо сотрудничества из ваших дочерних окон.

0 голосов
/ 05 мая 2010

Вы не делаете ничего «неправильного», но Windows просто отправляет сообщение правильному элементу управления. Он также не отправляет сообщение всем элементам управления.

Для ключевых событий есть свойство Form.KeyPreview, которое позволяет форме также получать события, но я не знаю ничего подобного для событий мыши.

...