Разместите окно 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