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

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

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

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

Jah loves you.
...
Рейтинг: 0 / 0
02.02.2010, 13:27
    #36444396
awl100Alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отслеживать TOPMOST своей формы?
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
02.02.2010, 13:48
    #36444480
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отслеживать TOPMOST своей формы?
Изменять стили чужих окон — идея отстойная. А если столкнутся две такие программы? Или две копии вашей? Это такая свистопляска получится.

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

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

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

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

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


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