如何使用P / Invoke打开表单中的Shown事件?

时间:2015-05-30 05:54:22

标签: .net vb.net winforms events

我需要打开通知表单,而不会在出现时给予关注。 It works fine using P/Invoke除了已显示事件未启动的事实。 我的解决方案在这里,但是更优雅(更通用)吗?

Public Shared Sub ShowInactiveTopmost(frm As Form)
    'standard P/Invoke code
    ShowWindow(frm.Handle, SW_SHOWNOACTIVATE)
    SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST,
                 frm.Left, frm.Top, frm.Width, frm.Height, SWP_NOACTIVATE)

    'invocation of 'Shown' event - can this be made independent of 'NotifForm' type?
    CType(frm, NotifForm).NotifForm_Shown(Nothing, New EventArgs())
End Sub

我尝试了使用RaiseEvent Shown()的更通用的方法,但它抛出了错误Derived classes cannot raise base class events.

1 个答案:

答案 0 :(得分:0)

汉斯'评论我发现,即使没有P / Invoke,表单也可以显示为无焦点,使用标准Show()添加ShowWithoutActivation属性覆盖,如MSDN description of ShowWithoutActivation property中所述。

然后显示的事件按预期工作。

'use this with standard form.Show() instead of P/Invoke stuff
Protected Overrides ReadOnly Property ShowWithoutActivation As Boolean
    Get
        Return True
    End Get
End Property