当笔位于按钮上时(在 WndProc 方法中),笔鼠标消息被抑制。如何解决这个问题?
Pen mouse messages are suppressed when pen is positioned on a button (in WndProc method). How to fix this?
我想随时随地跟踪笔的位置。我希望 WndProc 被调用,即使它在按钮上也是如此。但是,如果窗体中有按钮,则不会发生 wndProc。我该怎么办?
一些细节:
某些笔鼠标消息出现在 wndProc 的消息中。 (pen mouse message's Msg is 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
}
}
因为我没有笔,所以没有测试,但原则上这个概念应该可行。
使用 IMessageFilter Interface 实现来检测发送到表单或其子控件之一的 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;
}
}
Install/remove 基于表单的过滤器 activation/deactivation.
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);
}
}
我想随时随地跟踪笔的位置。我希望 WndProc 被调用,即使它在按钮上也是如此。但是,如果窗体中有按钮,则不会发生 wndProc。我该怎么办?
一些细节:
某些笔鼠标消息出现在 wndProc 的消息中。 (pen mouse message's Msg is 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
}
}
因为我没有笔,所以没有测试,但原则上这个概念应该可行。
使用 IMessageFilter Interface 实现来检测发送到表单或其子控件之一的 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;
}
}
Install/remove 基于表单的过滤器 activation/deactivation.
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);
}
}