gpt4 book ai didi

.net - 所有右键单击的通用处理程序

转载 作者:行者123 更新时间:2023-12-02 04:15:05 24 4
gpt4 key购买 nike

我想为我的应用程序中发生的所有右键单击(或可能其他一些独特的行为,如中键单击等)创建一个通用处理程序。他们会调用相同的 Action ,例如启动对话框以自定义单击的控件或为其显示帮助对话框。

有没有一种机制可以让我拦截应用程序中的所有点击事件,每个事件都提供对点击发生的控制的引用?蛮力解决方案是使用反射来迭代我正在创建的每种表单中的所有控件并在那里附加一个处理程序,但我正在寻找更简单的东西。

最佳答案

您可以尝试在表单上实现 IMessageFilter 接口(interface)。还有其他几个讨论和文档。一种可能的解决方案可能看起来像(创建一个表单,在其上放置一个按钮,从下面添加必要的代码,运行它并尝试右键单击表单和按钮):

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;
}
}
}

关于.net - 所有右键单击的通用处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3250724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com