1

我想从任何地方跟踪笔的位置。我希望 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
    }
}
4

1 回答 1

0

这没有经过测试,因为我没有笔,但原则上这个概念应该有效。

使用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);
    }
}
于 2019-06-12T16:36:47.407 回答