是否可以使父页面中的按钮单击事件优先于子页面上的事件

Is it possible to make a button click event in a parent page take priority over the event on the child page

我有 600 多个页面都有一个取消按钮,它们都调用一行 Response.Redirect("~/Default.aspx"); 来导航到主屏幕。这些页面都继承自一个基页,我不确定为什么按钮点击不只是在基页中定义,因为在我开始处理它之前这一切都已准备就绪。

我正在尝试将按钮单击事件移至基页,因为它不再总是转到站点的根目录,现在需要根据站点的区域转到四个主屏幕之一用户当前在所以我需要在重定向发生之前执行一些功能。

我知道我可以从页面中删除按钮单击事件并将其添加到基页中,但这意味着拖网 600 多页所以我想知道是否可以添加按钮单击事件到基本页面并使其覆盖实际页面上的任何事件,这样我就不必将它们全部删除。仅仅将事件添加到基页是行不通的,因为它似乎总是触发页面事件,甚至不查看基页。

我已经尝试将递归 FindControl 循环添加到 OnInitOnLoad 基本页面事件以查找按钮并覆盖 Button.PostBackUrl,但它出现循环控制会导致其他领域出现问题。这是另一天的问题!

我知道这不是最好的解决方案,因为它会在所有页面上留下冗余代码,但我只需要一个快速的解决方案。

如有任何帮助,我们将不胜感激。 谢谢

您要做的是拦截发送到按钮的 WM_MOUSE 消息。在 windows 中,这称为挂钩,通过挂钩,您可以在其他人收到消息之前说您想要 windows 消息。您可以调查邮件并决定将邮件发送到原始目的地,或保留邮件。在这种情况下,原始目的地将不会收到 windows 消息,也不会注意到按钮已被按下。

使用 win32.dll 中的 SetWindowsHookEx 挂钩消息链。这是非常低级的,因此是不安全的代码。 Whosebug 上有几个关于 SetWindowsHookEx、CallNextHookEx、UnhookWindowsHookEx 的问题,但我找不到有效的示例。

Microsoft 有一个关于如何执行此操作的简单示例。
How to set a Windows hook in Visual C# .NET

这个例子展示了如何在另一个window中获取鼠标移动。它使用一个过时的函数。幸运的是它仍然有效。

要删除已弃用的函数,请更改以下内容

hHook = SetWindowsHookEx(WH_MOUSE,
            MouseHookProcedure,
            (IntPtr)0,
            AppDomain.GetCurrentThreadId()); <== obsolete

将其替换为:

ProcessThread runningThread = Process.GetCurrentProcess().Threads
    .OfType<ProcessThread>()
    .SingleOrDefault(thread => thread.ThreadState == ThreadState.Running );
    if (runningThread != null)
    {
        hHook = SetWindowsHookEx(WH_MOUSE,
            MouseHookProcedure,
            (IntPtr)0,
            runningThread.Id);    // <== works ok
    }

挂钩和脱钩是一个相当繁琐的过程。幸运的是,一个 nuget 包为你解决了这些困难:

Nuget Package MouseHook

如果在控件获取事件之前应用程序中发生任何鼠标事件,您将使用此包获取事件。对于每个事件,您可以决定是要控件获取消息还是要执行其他操作并吞下消息。请参阅 MouseHook

中的示例