VB.NET 2005 - "全球"事件处理程序?

Har*_*ode 5 vb.net winforms

假设对于WinForms应用程序中的每个Form,您希望将光标更改为WaitCursor.显而易见的方法是将代码添加到实例化/显示表单的每个位置:

Try
    Me.Cursor = Cursors.WaitCursor

    Dim f As New frmMyForm
    f.Show()

Catch ex As Exception
    Throw
Finally
    Me.Cursor = Cursors.Default
End Try
Run Code Online (Sandbox Code Playgroud)

但是,我想知道是否有办法告诉你的应用程序,"每当任何表单Load事件触发时,显示一个WaitCursor.当表单事件显示完成后,将光标设置回Default." 这样,Me.Cursor代码可能只在一个地方而不是分散在整个应用程序中 - 并且不会忘记将它放入每个表单实例化中.

我想您可以继承常规Form类并在重写事件中添加游标设置,但我相信当您继承Form对象时,您将失去可视化设计器功能.

ng5*_*000 2

回答你的问题 - 没有全球 .Net 事件来实现你想要的。对此没有任何纯 .net 解决方案。您可以看一下面向方面的编程和横切关注点 - 可能有一个 AOP 解决方案(一些谷歌搜索将帮助您开始,然后发回此处了解详细信息)。

然而,接下来的更多的是关于如何使用 win32 消息传递实现此目的的想法,而不是完整的解决方案。

  1. 您需要确定哪些 win32 消息对应于 Load 事件,以及是否有一条 win32 消息总是在 load 事件之后发生。加载事件的候选者之一可能是WM_SHOWWINDOW,但我不确定。
  2. 编写一个消息过滤器类(即实现IMessageFilter)。
  3. 在消息过滤器类的 PreMessageFilter 方法中检查消息类型,如果它是具有正确参数的 WM_SHOWWINDOW (或其他)消息,则您可以设置/重置光标(使用 Cursor.Current = Cursors.WaitCursor - 再次您需要测试此)