Недавно меня запарила Android Studio тем что постоянно ворует фокус. Я попытался с этим что-то сделать, погуглил, и обнаружил, что воровство фокуса в винде - это общемировая боль в заднем проходе: https://www.google.com/search?q=windows+prevent+process+from+stealing+focus https://www.change.org/p/microsoft-stop-focus-stealing https://social.technet.microsoft.co...ation-from-stealing-focus-ever-is-it-possible В интернетах есть всего одно решение через изменение определенных значений в реестре, но это решение не работает начиная с Windows 7. И вот что я думаю: почему бы не написать proxy DLL для user32.dll (как я понимаю все манипуляции с окнами - в ней?), и просто глушить все функции, которые манипулируют фокусом? Ну и чтобы два раза не вставать: какие вообще есть способы передать фокус окну?
"Фокус" в винде понятие растяжимое. То, что ты предложил, по-моему слишком жостко. SetActiveWindow SetForegroundWindow SetFocus (WM_KILLFOCUS/WM_SETFOCUS) LockSetForegroundWindow - вряд ли юзабельно, но интересно SystemParametersInfoA(SPI_SETFOREGROUNDLOCKTIMEOUT) - вот сюда самое пристальное внимание обрати, это должно быть аналогом манипуляций с реестром На худой конец можно поковыряться непосредственно с назойливыми приложениями и убедить их так никогда не делать.
_DEN_, Я бы все же в начале выяснил причину. У меня фокус еще ни раз не терялся. (10 винда, а на 7ке и подавно) .
f13nd, спасибо. Дело в том, что назойливое приложение - Android Studio - оно написано на Java + Kotlin + C++, патчить видимо придется саму VM? TermoSINteZ, не совсем понимаю, что значит выяснить причину? Причина в том, что винда позволяет отнимать фокус (что уже ахтунг), и нечистоплотные приложения этим активно пользуются. --- Сообщение объединено, Oct 24, 2019 --- TermoSINteZ, не знаю как в 10, а в 7 есть такая проблема: если установлен апдейт винды, и требуется перезагрузка, то системное окно, предлагающее перезагрузку, при появлении тоже отнимает фокус. То есть сидишь такой, печатешь сообщение, и тут - КУЯК - появилось окно, и ты нажал какую-то кнопку которая была шоткатом для "Reboot now" в этом окне, и привет
_DEN_, так это ж бай дизайн. То есть ты борешься щас с ветряными мельницами Более того - в Линуксе тоже самое. Можешь решить эту проблему кардинально - использовать - терминал )
Если удастся запустить ява-составляющую в еклипсе, то он с некоторыми ограничениями отладчик не хуже ольги. Без всяких исходников и отладочной инфы. В ява-классы прекрасно заходят олдскульные нопы.
Ну тут я рассуждаю как домохозяйка - у меня баттхерт и мне надо от него избавиться. Обоснованность механизмов, ведущих к моему баттхерту, меня совершенно не интересует Мне нужно собирать Android NDK + Java приложение и уметь его интегрировать со сторонними либами, заточенными под сборку в gradle. Указанный софт мне в этом поможет?
По большому счету ТС нужно исследование проблемы, чтобы ответить на вопрос - почему и как, затем искать решение. Общесистемный хук на user32 может быть решением (впрочем, чреватым проблемами) а может и не быть, не факт, что поможет против системных модальных окон, которые как раз by design. _DEN_, тебя окно UAC'а не раздражает? Мне просто интересно --- Сообщение объединено, Oct 24, 2019 --- Как вариант решения - постоянно висящая в трее утиль, которая отслеживает воровство фокуса системой и возвращает пользователю.
Нет, ведь оно появляется ожидаемо в ответ на мои осознанные действия, а не тогда когда ему вздумается, и не приводит к неожиданным последствиям. --- Сообщение объединено, Oct 24, 2019 --- Вы бы посмотрели результаты поиска в гугле по ссылке выше. Там у всего цивилизованного мира баттхерт, а не только у меня.
между прочим 1 из чуваков очень грамотно ответил на эту "проблему" Более того есть неплохое решение (о котором тебе намекнули выше про реестер)
Хоспаде, да все решается элементарно. Пример - Pointer Lock API в JavaScript. Курсор можно захватить только внутри обработчика юзерского инпута. То есть - только если юзер на что-то нажал (например на кнопку). Просто так, после загрузки страницы - нельзя. И никакие таймеры не нужны. В винде все рулится функцией сообщений окна. Вот там и надо делать (разрешать) захват фокуса. То есть если мы внутри функции окна, и при этом сообщение - одно из юзеринпутских (WM_LBUTTONDOWN, и т.д.) - вот тогда и разрешать активацию. Ну и разумеется различать ситуации, когда сообщение отправлено физическим нажатием или же программно через PostMessage. Другое дело что сами внутренности ОС могут представлять собой свалку легаси-костылей, которые не позволяют это сделать. Браузеры-то Pointer Lock запилили совсем недавно, и могли подумать обо всем заранее, а в винде там небось потроха тянутся еще со времен наших бабушек --- Сообщение объединено, Oct 24, 2019 --- Вот это решение как раз начиная с семерки и не работает. Я бы не стал запиливать тред на васме если бы не исчерпал все рецепты
Недавно разбирался с похожей проблемой, а именно если окну посылать нажатия F12 то под отладчиком создаётся поток(ядром гуя, те независимо от того, какой отладчик). Вот только установить фокус для отправки сообщения не получается стабильно, работает если сканкоды в поток ввода добавлять(sendinput etc). В принципе интересно разобраться, но сначала нужно сам механизм понять.
любая ось позволяет отнимать фокус == единственный способ прекратить такое безобразие еть отключить приложухи с такими хулиганскими наклонностями иль перенастроить их. Так что TermoSINteZ сказал верно == надо найти хулиганов и выяснить причину их поведения. кстати, вирии таким баловаться могут.
Подозреваю что если в макоси приложение будет отнимать фокус, то его быстренько погонят из аппстора ссаной метлой
_DEN_, так отнимает же не ОС а приложение. Тут получается ОСЬ не виновата. ПРосто в Апсторе вероятно лучше приложения тестируют. Это не достоинство макос .
оно-то, да. Однако, воровство фокуса мб весьма незаметным для юзера == малваря может отслеживать/перенаправлять внимание юзверя, тем самым добиваясь незаметности своих действий а-ля напёрсточник. Тут ваще сплошной Клондайк назревает... к примеру, в лине имеется вполне себе легальная тулза xdotool https://www.semicomplete.com/projects/xdotool/
Пoмнится, в Windows'98 меня напрягало то, что в какой-нибудь программе докапываешься до нужного пункта хитровложенного меню и внезапно от другой программы приходит ахтунг в виде окошечка с кнопками ОК/Отмена. И это меню раз и схлопывается! И надо опять мышом открывать пунктики. (Например, жмёшь Пуск->Программы->Стандартные->Интернет->NetMeeting и только готовишься его запустить, как конвертор видео выводит окно с вопросом, открыть ли папку с результатом? И вся эта пирамида пунктиков меню схлопывается именно тогда, когда я вот-вот готовился кликнуть на NetMeeting! Всё это жутко бесило!!!) Когда установил Windows'2000, сразу приятно заметил, что активные меню не схлопываются, даже если сзади запускаются какие-то программы и открываются новые окна. А вот в той же Windows'8 всплыли древнейшие детские болячки интерфейса с корью и ветрянкой!