Сообщения мыши с пером подавляются, когда ручка расположена на кнопке (в методе WndProc).Как это исправить? - PullRequest
1 голос
/ 12 июня 2019

Я хочу отслеживать положение ручки из любой точки мира.Я хочу, чтобы WndProc вызывался, даже если он находится на кнопке.Но, если в форме есть кнопка, wndProc не происходит.Что мне делать?

Некоторые детали:

В сообщении wndProc содержится определенное сообщение мыши.(Msg сообщения пера мыши - 0x0711)

Если я переместу перо внутри формы, значение продолжит появляться с помощью wndProc.Но, если в форме есть кнопка, wndProc не появляется на кнопке.

public const int PEN = 0x0711;
protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    if (PEN == m.Msg)
    {
       // TODO: function
    }
}

1 Ответ

0 голосов
/ 12 июня 2019

Это не было проверено, поскольку у меня нет пера, но в принципе концепция должна работать.

Используйте реализацию Интерфейс IMessageFilter , чтобы обнаружить сообщение PEN, отправляемое в форму или один из его дочерних элементов управления, и выполнить нужную функцию.

class PenFilter : IMessageFilter
{
    private const int PEN = 0x0711;
    private readonly Form parent;
    public PenFilter(Form parent)
    {
        this.parent = parent;
    }
    bool IMessageFilter.PreFilterMessage(ref Message m)
    {
        Control targetControl = Control.FromChildHandle(m.HWnd);
        if (targetControl != null && (targetControl == parent || parent == targetControl.FindForm()))
        {
            // execute your function
        }
        return false;
    }
}

Установка / удаление фильтра на основе активации / деактивации формы.

public partial class Form1 : Form
{
    private PenFilter penFilter;
    public Form1()
    {
        InitializeComponent();
        penFilter = new PenFilter(this);
    }

    protected override void OnActivated(EventArgs e)
    {
        Application.AddMessageFilter(penFilter);
        base.OnActivated(e);
    }
    protected override void OnDeactivate(EventArgs e)
    {
        Application.RemoveMessageFilter(penFilter);
        base.OnDeactivate(e);
    }
}
...