Разместите окно VB.Net поверх всех окон.

У меня есть окно, которое должно оставаться поверх слайд-шоу Power Point. Так должно быть поверх всех окон. Я сделал это легко, используя VB 6, используя Lib "user32", но, похоже, это сложно с VB.net.

Me.TopMost = True

Кажется, это не работает, поскольку работает только внутри программы.

  Private Declare Function BringWindowToTop Lib "user32" Alias "BringWindowToTop" (ByVal hwnd As Long) As Long
    Private Sub frmTmr_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
        BringWindowToTop(Me.Handle)
    End Sub

Это также дает ошибку! Любая помощь очень ценится! Заранее спасибо,

С уважением

Manjula

1 ответ

Решение

Если вы хотите, чтобы окно в вашем приложении всегда отображалось поверх окна другого приложения, тогда BringWindowToTop Функция определенно не то, что вы хотите. Для начала, как вы заметили, вы должны повторно вызывать функцию, используя таймер. Это должно быть вашей первой подсказкой, что это неправильный API. Другая проблема заключается в том, что он только выводит ваше окно на вершину Z-порядка для своего процесса, а не на все остальные процессы, работающие в системе. Как объясняется в документации,

Вызов этой функции аналогичен вызову SetWindowPos функция для изменения положения окна в Z-порядке. BringWindowToTop не делает окно окном верхнего уровня.

Последнее предложение должно указывать, что есть лучший способ. Windows имеет встроенную поддержку окон верхнего уровня (то есть тех, которые всегда должны отображаться поверх других окон): они называются окнами самого верхнего уровня. Это именно то, что вы хотите. Самые верхние окна всегда появляются над не верхними окнами.

Раймонд Чен пытается объяснить некоторую путаницу в своем блоге. Обратите внимание, что в этом случае HWND_TOP эквивалентно BringWindowToTop, Вместо этого вы хотите HWND_TOPMOST,

Самый простой способ сделать окно самым верхним - это указать WS_EX_TOPMOST флаг, когда вы создаете окно..NET Framework скрывает большую часть работы по созданию окон за кулисами, но вы можете настроить параметры в случае необходимости, переопределив CreateParams свойство вашей формы класса.

Вот пример кода, чтобы форма всегда была самой верхней:

Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Const WS_EX_TOPMOST As Integer = &H00000008

        Dim cp As CreateParams = MyBase.CreateParams
        cp.ExStyle = cp.ExStyle Or WS_EX_TOPMOST
        Return cp
    End Get
End Property

Это не будет работать, если вы хотите переключать самое верхнее состояние окна во время выполнения. Для этого вам придется P/Invoke SetWindowPos функция. P/Invoke похож на то, что вы делали в VB6 с Declare утверждение, но семантика немного изменилась для мира.NET - поэтому вы не можете использовать свой старый VB6 Declare заявления в VB.NET.

Вот как этот код может выглядеть для VB.NET:

<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
End Function

Private Const SWP_NOSIZE As Integer = &H1
Private Const SWP_NOMOVE As Integer = &H2

Private Shared ReadOnly HWND_TOPMOST As New IntPtr(-1)
Private Shared ReadOnly HWND_NOTOPMOST As New IntPtr(-2)

Public Function MakeTopMost()
    SetWindowPos(Me.Handle(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Function

Public Function MakeNormal()
    SetWindowPos(Me.Handle(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Function
Другие вопросы по тегам