我想在我的应用程序中创建一个通用处理程序,包括所有正确的点击(或者可能还有一些其他独特的行为,例如中间按钮点击等)。他们会调用相同的动作,例如启动对话框以自定义单击的控件或显示它的帮助对话框。
是否有一种机制,允许我拦截应用程序中的所有点击事件,每个机制都提供对点击发生的控制的参考?蛮力解决方案是使用反射迭代我正在创建的每个表单中的所有控件并在那里附加处理程序,但我正在寻找更直接的东西。
答案 0 :(得分:1)
您可以尝试在表单上实现IMessageFilter接口。还有其他几个讨论和文档。一个可能的解决方案可能是(创建一个表单,在其上放置一个按钮,从下面添加必要的代码,运行它并尝试右键单击表单和按钮):
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form, IMessageFilter
{
private const int WM_RBUTTONUP = 0x0205;
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetCapture();
public Form1()
{
InitializeComponent();
Application.AddMessageFilter(this);
}
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_RBUTTONUP)
{
System.Diagnostics.Debug.WriteLine("pre wm_rbuttonup");
// Get a handle to the control that has "captured the mouse". This works
// in my simple test. You can read the documentation and do more research
// on it if you'd like:
// http://msdn.microsoft.com/en-us/library/ms646257(v=VS.85).aspx
IntPtr ptr = GetCapture();
System.Diagnostics.Debug.WriteLine(ptr.ToString());
Control control = System.Windows.Forms.Control.FromChildHandle(ptr);
System.Diagnostics.Debug.WriteLine(control.Name);
// Return true if you want to stop the message from going any further.
//return true;
}
return false;
}
}
}