:: Visual Foxpro, Foxpro for DOS
Определить активность приложения (фокус на приложения)
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
При наступлении некоторого события, надо вывести приложение на 1й план.
все давно известно
_Screen.Windowstate= 1 --Вот она заморочка
loShell=CreateObject("WScript.Shell")
loShell.AppActivate(_SCREEN.Caption)
_Screen.Windowstate= 0
далее нужный код

Но если убрать строку _Screen.Windowstate= 1
То приложение в трее мигает, но на 1й план не выходит.
А если строку оставить, то недоумения у юзера, по случаю моргания приложения)))
Если он работает в нем.

Не могу найти апи, для проверки что фокус находится у меня.


------------------
Ratings: 0 negative/0 positive
Re: Определить активность приложения (фокус на приложения)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В поиске полно обсуждений SetForegroundWindow
Всё зависит от того кто именно и кого пытается вывести вперёд.
Активный процесс своё собственное окно - это одно. Фоновый процесс, да ещё и если чужое окно (от другой программы) - совсем другое дело. Плюс период "блокировки" SPI_GETFOREGROUNDLOCKTIMEOUT... WScript.Shell никаких "чудес" отличных от SetForegroundWindow не делает...
Ты сам, похоже, переводишь свой процесс в фон, потому он и не может "подняться наверх" и помешать текущему активному процессу.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Определить активность приложения (фокус на приложения)
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Не совсем понял, что такое
Igor Korolyov
Ты сам, похоже, переводишь свой процесс в фон
Само приложение этого не делает.
Юзер поработал с ним, и перешел работать с другим.
Но приложение работает. И получает по таймеру данные, и в случае необходимости, его надо вывести вперед, активным, в фокусе.
Оно может быть свернуто, может просто прикрыто.
SetForegroundWindow(lnhwnd) ни каких действий не оказывает, увы(
вин 10
есть 64, есть 32

Железно работает приведенная конструкция.
Но из-за _Screen.Windowstate= 1...
В общем все выше описал)
Это тоже не помогает
*!* SendMessage(lnhwnd, WM_MOUSEWHEEL, ICON_ID, ICON_CLICK)
*!* qq=SetForegroundWindow(lnhwnd)
Могу накидать тестик... чуть позже, сейчас долгий путь домой. Пятница, дачники)))


------------------




Исправлено 1 раз(а). Последнее : Аспид, 29.06.18 16:27
Ratings: 0 negative/0 positive
Re: Определить активность приложения (фокус на приложения)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Оно и не должно оказывать никаких действий. Винда, начиная с какой-то версии защищает пользователя от программ с похабными привычками всплывать наверх посередине процесса работы пользователя, красть фокус ввода и тем самым мешать его работе - именно поэтому когда приложение "в фоне", оно не всплывает, а моргает кнопкой на таскбаре (если его пытаются "поднять" этой самой SetForegroundWindow). При этом если пользователь "отошёл", и некоторое время не проявлял никакой активности, то система уже позволяет другой программе "всплыть" из фона на первый план.
Просто воспользуйся поиском - проблема подробно обсуждалась, в т.ч. и пути её решения приводились. Помнится с покойным Михаилом Дроздовым большущая дискуссия была по этому поводу...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Определить активность приложения (фокус на приложения)
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Да искал, что то безрезультатно.
Все старое, и на вин 10 не то.
Потому и думаю, найти функцию, которая покажет где фокус, и если он у меня, то ничего не делаю, а коли нет, то выше способ все работает.


------------------




Исправлено 1 раз(а). Последнее : Аспид, 29.06.18 18:51
Ratings: 0 negative/0 positive
Re: Определить активность приложения (фокус на приложения)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
GetForegroundWindow получает текущее активное окно, потом GetWindowThreadProcessId получает id процесса во 2 (out, т.е. передаваемом по ссылке) параметре - можно сравнить с _VFP.ProcessId
Если известно какое именно окно должно быть активным в рамках твоего процесса, можно сразу сравнить хендл GetForegroundWindow с его хендлом (например прога на основе _SCREEN - можно сравнивать с _VFP.HWnd - это "верхнее" окно фоксового процесса).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Определить активность приложения (фокус на приложения)
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Огромное человеческое спасибо!)
GetForegroundWindow + _VFP.HWnd полностью спасло.
Удивляюсь, как ты быстро такое находишь!)
Я вчера пол дня потратил... и фига)


------------------
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 (Гостей: 22)

© 2000-2024 Fox Club 
Яндекс.Метрика