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

本文关键字:事件 优先于 有可能 单击 是否 按钮 | 更新日期: 2023-09-27 18:19:21

我有超过600个页面都有一个取消按钮,他们都调用一行Response.Redirect("~/Default.aspx");来导航到主屏幕。这些页面都继承自基页,我不确定为什么按钮单击不只是在基页中定义,因为这是在我开始工作之前所有的地方。

我试图将按钮单击事件移动到基页,因为而不是总是去网站的根,它现在需要去四个主屏幕之一,这取决于该网站的用户目前所在的区域,所以我需要在重定向发生之前执行一些功能。

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

我已经尝试向OnInitOnLoad基页事件添加递归FindControl循环以找到按钮并覆盖Button.PostBackUrl,但似乎通过控件循环会导致其他领域的问题。那是以后的问题了!

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

任何帮助都会很感激。由于

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

您要做的是拦截发送给按钮的WM_MOUSE消息。在windows中,这被称为钩子,有了钩子,你可以说你想在别人收到windows消息之前得到它。您可以调查消息并决定将消息发送到原始目的地,或者保留消息。在这种情况下,原始目的地将不会收到windows消息,也不会注意到按钮被按下。

在win32.dll中使用SetWindowsHookEx来连接消息链。这是非常低的级别,因此是不安全的代码。在StackOverflow上有几个关于SetWindowsHookEx, CallNextHookEx, UnhookWindowsHookEx的问题,但我找不到一个架子的例子。

关于如何做到这一点,微软有一个简单的例子。
如何在Visual c# .NET中设置Windows钩子

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

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

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

中的示例