Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Форма поверх всех окон


Автор: ИгнатьевАлексей 27.9.2022, 07:03
Друзья, помогите, пож-та!

Перепробовал множество вариантов, с сайтов, с нашего форума... и все-равно задачу не решил  smile 
Мне нужно вывести форму поверх всех окон.

У меня Win10, Office365 (VBA, но я пишу сюда, хоть и не уверен, что верно делаю).

Во всех вариантах, что я пробовал, форма выводится как-то странно. То вылезает наверх, как нало, а то, мигает вместе с Excel.
Как то приметил, что поверх браузерных окон она не хочет вылезать.

Вот последний вариант, что я пробовал:

Код

' SetWindowPos Flags
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOZORDER = &H4
Const SWP_NOREDRAW = &H8
Const SWP_NOACTIVATE = &H10
Const SWP_FRAMECHANGED = &H20        '  The frame changed: send WM_NCCALCSIZE
Const SWP_SHOWWINDOW = &H40
Const SWP_HIDEWINDOW = &H80
Const SWP_NOCOPYBITS = &H100
Const SWP_NOOWNERZORDER = &H200      '  Don't do owner Z ordering
Const SWP_DRAWFRAME = SWP_FRAMECHANGED
Const SWP_NOREPOSITION = SWP_NOOWNERZORDER
' SetWindowPos() hwndInsertAfter values
Const HWND_TOP = 0
Const HWND_BOTTOM = 1
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2

#If Win64 Then
    Private Declare PtrSafe Function SetForegroundWindow Lib "user32" _
               (ByVal hwnd As LongPtr) As LongPtr
               
    Private Declare PtrSafe Function SetWindowPos Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal hWndInsertAfter As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal cx As Long, _
    ByVal cy As Long, _
    ByVal wFlags As Long) As LongPtr
    
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
                (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

#Else
    Private Declare Function SetForegroundWindow Lib "user32" _
               (ByVal hWnd As Long) As Long
    
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
                (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
                
    Private Declare Function SetWindowPos Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal hWndInsertAfter As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal cx As Long, _
    ByVal cy As Long, _
    ByVal wFlags As Long) As Long
#End If



Private Sub UserForm_Activate()
    Dim hwnd As Long
    hwnd = FindWindow(vbNullString, Me.Caption)
    SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOSIZE + SWP_NOMOVE + SWP_SHOWWINDOW)

End Sub

 

Заранее спасибо, друзья!

Автор: Akina 27.9.2022, 07:14
Представь на секунду, что задача решена, и окно появляется поверх остальных. Но через секунду код или скрипт в браузере даёт команду своему окну вылезти поверх всех остальных...

Твоё окно надо кроме всего прочего сделать глобально-модальным. Чтобы до его закрытия у других окон не было шансов.

Автор: ИгнатьевАлексей 27.9.2022, 08:21
Akina, спасибо!

Теперь понимаю, почему не получается.

А Вы не долкнете меня в нужном направлении для поиска? В инете я как-то особо этого не нашел. У нас на форуме тоже... smile 

Автор: Akina 27.9.2022, 20:43
Никогда этими вещами не занимался...

Автор: Oldshelf 28.9.2022, 09:02
Цитата(ИгнатьевАлексей @  27.9.2022,  08:21 Найти цитируемый пост)
В инете я как-то особо этого не нашел.

Не уверен, но кажется что-то похожее: https://ccm.net/computing/programming/3881-keep-application-window-on-top-of-other-apps-with-vb6/

Автор: ИгнатьевАлексей 6.10.2022, 07:05
Так и не решил пока проблему.
Причем, у меня не складывается ощущение, что мое окошко передавливают другие окна. Оно само как-то капризничает в зависимости от того, в каком положении я оставил сам Excel и окно VB.

Автор: RubyLudwigValentin 4.3.2023, 11:44
Смотрите на свойства TOP, TOPMOST.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)