Windows и воровство фокуса

Тема в разделе "WASM.HEAP", создана пользователем _DEN_, 23 окт 2019.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Недавно меня запарила 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 (как я понимаю все манипуляции с окнами - в ней?), и просто глушить все функции, которые манипулируют фокусом? Ну и чтобы два раза не вставать: какие вообще есть способы передать фокус окну?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    "Фокус" в винде понятие растяжимое. То, что ты предложил, по-моему слишком жостко.

    SetActiveWindow
    SetForegroundWindow
    SetFocus (WM_KILLFOCUS/WM_SETFOCUS)
    LockSetForegroundWindow - вряд ли юзабельно, но интересно
    SystemParametersInfoA(SPI_SETFOREGROUNDLOCKTIMEOUT) - вот сюда самое пристальное внимание обрати, это должно быть аналогом манипуляций с реестром

    На худой конец можно поковыряться непосредственно с назойливыми приложениями и убедить их так никогда не делать.
     
  3. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    _DEN_, Я бы все же в начале выяснил причину. У меня фокус еще ни раз не терялся. (10 винда, а на 7ке и подавно) .
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    f13nd, спасибо.

    Дело в том, что назойливое приложение - Android Studio - оно написано на Java + Kotlin + C++, патчить видимо придется саму VM? :)

    TermoSINteZ, не совсем понимаю, что значит выяснить причину? :) Причина в том, что винда позволяет отнимать фокус (что уже ахтунг), и нечистоплотные приложения этим активно пользуются.
    --- Сообщение объединено, 24 окт 2019 ---
    TermoSINteZ, не знаю как в 10, а в 7 есть такая проблема: если установлен апдейт винды, и требуется перезагрузка, то системное окно, предлагающее перезагрузку, при появлении тоже отнимает фокус. То есть сидишь такой, печатешь сообщение, и тут - КУЯК - появилось окно, и ты нажал какую-то кнопку которая была шоткатом для "Reboot now" в этом окне, и привет :)
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    _DEN_, так это ж бай дизайн. То есть ты борешься щас с ветряными мельницами
    Более того - в Линуксе тоже самое.
    Можешь решить эту проблему кардинально - использовать - терминал )
     
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Если удастся запустить ява-составляющую в еклипсе, то он с некоторыми ограничениями отладчик не хуже ольги. Без всяких исходников и отладочной инфы. В ява-классы прекрасно заходят олдскульные нопы.
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    переходи на Flutter + VSCode...
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ну тут я рассуждаю как домохозяйка - у меня баттхерт и мне надо от него избавиться. Обоснованность механизмов, ведущих к моему баттхерту, меня совершенно не интересует :)

    Мне нужно собирать Android NDK + Java приложение и уметь его интегрировать со сторонними либами, заточенными под сборку в gradle. Указанный софт мне в этом поможет?
     
  9. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    По большому счету ТС нужно исследование проблемы, чтобы ответить на вопрос - почему и как, затем искать решение. Общесистемный хук на user32 может быть решением (впрочем, чреватым проблемами) а может и не быть, не факт, что поможет против системных модальных окон, которые как раз by design.
    _DEN_, тебя окно UAC'а не раздражает? Мне просто интересно :)
    --- Сообщение объединено, 24 окт 2019 ---
    Как вариант решения - постоянно висящая в трее утиль, которая отслеживает воровство фокуса системой и возвращает пользователю.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Нет, ведь оно появляется ожидаемо в ответ на мои осознанные действия, а не тогда когда ему вздумается, и не приводит к неожиданным последствиям.
    --- Сообщение объединено, 24 окт 2019 ---
    Вы бы посмотрели результаты поиска в гугле по ссылке выше. Там у всего цивилизованного мира баттхерт, а не только у меня.
     
  11. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    между прочим 1 из чуваков очень грамотно ответил на эту "проблему"
    Более того есть неплохое решение (о котором тебе намекнули выше про реестер)

     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Хоспаде, да все решается элементарно. Пример - Pointer Lock API в JavaScript. Курсор можно захватить только внутри обработчика юзерского инпута. То есть - только если юзер на что-то нажал (например на кнопку). Просто так, после загрузки страницы - нельзя. И никакие таймеры не нужны. В винде все рулится функцией сообщений окна. Вот там и надо делать (разрешать) захват фокуса. То есть если мы внутри функции окна, и при этом сообщение - одно из юзеринпутских (WM_LBUTTONDOWN, и т.д.) - вот тогда и разрешать активацию. Ну и разумеется различать ситуации, когда сообщение отправлено физическим нажатием или же программно через PostMessage. Другое дело что сами внутренности ОС могут представлять собой свалку легаси-костылей, которые не позволяют это сделать. Браузеры-то Pointer Lock запилили совсем недавно, и могли подумать обо всем заранее, а в винде там небось потроха тянутся еще со времен наших бабушек :)
    --- Сообщение объединено, 24 окт 2019 ---
    Вот это решение как раз начиная с семерки и не работает. Я бы не стал запиливать тред на васме если бы не исчерпал все рецепты :)
     
  13. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Недавно разбирался с похожей проблемой, а именно если окну посылать нажатия F12 то под отладчиком создаётся поток(ядром гуя, те независимо от того, какой отладчик). Вот только установить фокус для отправки сообщения не получается стабильно, работает если сканкоды в поток ввода добавлять(sendinput etc).

    В принципе интересно разобраться, но сначала нужно сам механизм понять.
     
  14. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.076
    любая ось позволяет отнимать фокус == единственный способ прекратить такое безобразие еть отключить приложухи с такими хулиганскими наклонностями иль перенастроить их. Так что TermoSINteZ сказал верно == надо найти хулиганов и выяснить причину их поведения. кстати, вирии таким баловаться могут.
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Подозреваю что если в макоси приложение будет отнимать фокус, то его быстренько погонят из аппстора ссаной метлой :)
     
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    _DEN_, так отнимает же не ОС а приложение.
    Тут получается ОСЬ не виновата.
    ПРосто в Апсторе вероятно лучше приложения тестируют.
    Это не достоинство макос .
     
    UbIvItS и Indy_ нравится это.
  17. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.076
    оно-то, да. Однако, воровство фокуса мб весьма незаметным для юзера == малваря может отслеживать/перенаправлять внимание юзверя, тем самым добиваясь незаметности своих действий а-ля напёрсточник. Тут ваще сплошной Клондайк назревает... :) к примеру, в лине имеется вполне себе легальная тулза xdotool https://www.semicomplete.com/projects/xdotool/
     
  18. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    911
    Адрес:
    Ташкент
    Пoмнится, в Windows'98 меня напрягало то, что в какой-нибудь программе докапываешься до нужного пункта хитровложенного меню и внезапно от другой программы приходит ахтунг в виде окошечка с кнопками ОК/Отмена. И это меню раз и схлопывается! И надо опять мышом открывать пунктики.
    (Например, жмёшь Пуск->Программы->Стандартные->Интернет->NetMeeting и только готовишься его запустить, как конвертор видео выводит окно с вопросом, открыть ли папку с результатом? И вся эта пирамида пунктиков меню схлопывается именно тогда, когда я вот-вот готовился кликнуть на NetMeeting! Всё это жутко бесило!!!)

    Когда установил Windows'2000, сразу приятно заметил, что активные меню не схлопываются, даже если сзади запускаются какие-то программы и открываются новые окна.

    А вот в той же Windows'8 всплыли древнейшие детские болячки интерфейса с корью и ветрянкой! :hunter: