powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как отслеживать TOPMOST своей формы?
13 сообщений из 13, страница 1 из 1
Как отслеживать TOPMOST своей формы?
    #36440988
awl100Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для отображения своей формы «поверх всех» использую функцию API - SetWindowPos с параметром "HWND_TOPMOST", но заметил, что другие запускаемые программы с таким же свойством, смещают мою форму к фону и перекрывают собой. Я пишу программу, которая работает с различными окнами других приложений и для это важно, чтобы она всегда была на виду.
Подскажите, пожалуйста, как мне проверить, что моя форма утратила свойство TOPMOST??? Пересмотрел другие похожие топики, но нигде не нашел ответа на этот вопрос.
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36441120
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверить и, если нет, сделать топмост?

Так делайте сразу топмост вместо проверки.
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36442506
awl100Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так в том-то и дело, что (я же написал...) топмост своей формы я делаю сразу. Но другие проги тоже запускаемые в режиме топмост, смещают мою форму. Вот мне нужно как-то отслеживать, что моя форма уже не топмост и снова сделать ей топмост. Вообщем, думаю, понятно объяснил.
Так вот, как мне проверить, что в процессе работы, моя форма уже не топмост???

Пробовал запускать SetWindowPos --> HWND_TOPMOST по циклу, получается... но, вместе с этим, появляются нежелательные эффекты: как только моя форма теряет фокус, сразу же начинает мигать своей панелью, что-то типа FlashWindows. Хотелось бы сделать без этих "спецэффектов", как-то более корректно. Наверняка есть какие-то способы проверять является ли форма топмост на данный момент или нет?
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36442615
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
awl100AlexТак вот, как мне проверить, что в процессе работы, моя форма уже не топмост??? По таймеру.
awl100AlexНаверняка есть какие-то способы проверять является ли форма топмост на данный момент или нет?GetForegroundWindow.
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36443031
awl100Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy
К сожалению GetForegroundWindow (функция возвращает хэндл активного окна) срабатывает как только моя форма теряет фокус и опять начинаются мигания панелькой.
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36443045
awl100Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужно чтобы моя форма, даже потеряв фокус, все равно оставалась "поверх всех" и автоматически восстанавливало это свойство, когда другие окна ее перекрывают при запуске.
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36443626
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще окно с HWND_TOPMOST при потере фокуса может быть перекрыто только другими HWND_TOPMOST.

Чтобы избежать мигания, нужно полностью имитировать действия пользователя, как если бы он кликнул по этому окну.

Jah loves you.
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36444396
awl100Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyВообще окно с HWND_TOPMOST при потере фокуса может быть перекрыто только другими HWND_TOPMOST.
Правильно! И чтобы этого не происходило, решил проблему таким вот образом... через проверку стиля WS_EX_TOPMOST активного окна.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_EXSTYLE = (- 20 )
Private Const WS_EX_TOPMOST = &H8&

Const HWND_TOPMOST = - 1 
Const HWND_NOTOPMOST = - 2 
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Private Declare Sub SetWindowPos Lib "user32" (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)

Private Sub Form_Load()
 Call TOPMOST_Manager(Me.hwnd, HWND_TOPMOST)
 Timer1.Interval =  1000  ' 1 сек
 Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
 Dim frmStyle As Long
 Dim activehWnd As Long
 activehWnd = GetForegroundWindow ' Получаем хэндл активной формы
 frmStyle = GetWindowLong(activehWnd, GWL_EXSTYLE) 'Получаем расширенный стиль формы
 If frmStyle And WS_EX_TOPMOST <>  0  Then 'Если бит TOPMOST установлен, тогда...
  Call TOPMOST_Manager(activehWnd, HWND_NOTOPMOST) 'Сбрасываем бит
  Call TOPMOST_Manager(Me.hwnd, HWND_TOPMOST) 'Переустанавливаем TOPMOST нашей формы
 End If
End Sub

Private Sub TOPMOST_Manager(hwnd As Long, pFlag As Integer)
 SetWindowPos hwnd, pFlag,  0 ,  0 ,  0 ,  0 , _
  SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End Sub

Проблема решена! :)
Antonariy спасибо за подсказку... просто немного расширил твою идею. :)
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36444480
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изменять стили чужих окон — идея отстойная. А если столкнутся две такие программы? Или две копии вашей? Это такая свистопляска получится.

Jah loves you.
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36444861
awl100Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyА если столкнутся две такие программы? Или две копии вашей? Это такая свистопляска получится.
Двух копий моей не будет – предусмотрено, да и не зачем. Насчет двух таких же программ... вполне может быть, но маловероятно. Обычно все используют однократную установку TOPMOST и не заморачиваются на подобных алгоритмах. К тому же других идей удовлетворяющее все возможные тонкости и условия у меня нет.
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36444877
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: awl100Alex
> Насчет двух таких же программ... вполне может быть, но маловероятно.

Я довольно активно использую Task Manager, который по умолчанию "поверх всех". Но меня спасет второй монитор
Это просто пример, навскидку из самого распространенного.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36447309
awl100Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пожалуй, нужно будет в процедуру Timer1 добавить после GetForegroundWindow еще строчку...
Код: plaintext
If activehWnd = Me.hwnd Then Exit Sub
Жаль, что на этом форуме нельзя редактировать сообщения.

Игорь Горбонос
Два монитора... – не думаю, что это самое распространенное явление. :)
...
Рейтинг: 0 / 0
Как отслеживать TOPMOST своей формы?
    #36447371
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня тоже два. И дома.

Jah loves you.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как отслеживать TOPMOST своей формы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]