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

Discussion in 'WASM.HEAP' started by _DEN_, Oct 23, 2019.

  1. _DEN_

    _DEN_ DEN

    Blog Posts:
    0
    Joined:
    Oct 8, 2003
    Messages:
    5,383
    Location:
    Йобастан
    Недавно меня запарила 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

    Blog Posts:
    0
    Joined:
    Jun 22, 2009
    Messages:
    2,020
    "Фокус" в винде понятие растяжимое. То, что ты предложил, по-моему слишком жостко.

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

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

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    _DEN_, Я бы все же в начале выяснил причину. У меня фокус еще ни раз не терялся. (10 винда, а на 7ке и подавно) .
     
  4. _DEN_

    _DEN_ DEN

    Blog Posts:
    0
    Joined:
    Oct 8, 2003
    Messages:
    5,383
    Location:
    Йобастан
    f13nd, спасибо.

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

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

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    _DEN_, так это ж бай дизайн. То есть ты борешься щас с ветряными мельницами
    Более того - в Линуксе тоже самое.
    Можешь решить эту проблему кардинально - использовать - терминал )
     
  6. f13nd

    f13nd Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 22, 2009
    Messages:
    2,020
    Если удастся запустить ява-составляющую в еклипсе, то он с некоторыми ограничениями отладчик не хуже ольги. Без всяких исходников и отладочной инфы. В ява-классы прекрасно заходят олдскульные нопы.
     
  7. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    переходи на Flutter + VSCode...
     
  8. _DEN_

    _DEN_ DEN

    Blog Posts:
    0
    Joined:
    Oct 8, 2003
    Messages:
    5,383
    Location:
    Йобастан
    Ну тут я рассуждаю как домохозяйка - у меня баттхерт и мне надо от него избавиться. Обоснованность механизмов, ведущих к моему баттхерту, меня совершенно не интересует :)

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

    ormoulu Well-Known Member

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

    _DEN_ DEN

    Blog Posts:
    0
    Joined:
    Oct 8, 2003
    Messages:
    5,383
    Location:
    Йобастан
    Нет, ведь оно появляется ожидаемо в ответ на мои осознанные действия, а не тогда когда ему вздумается, и не приводит к неожиданным последствиям.
    --- Сообщение объединено, Oct 24, 2019 ---
    Вы бы посмотрели результаты поиска в гугле по ссылке выше. Там у всего цивилизованного мира баттхерт, а не только у меня.
     
  11. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    между прочим 1 из чуваков очень грамотно ответил на эту "проблему"
    Более того есть неплохое решение (о котором тебе намекнули выше про реестер)

     
  12. _DEN_

    _DEN_ DEN

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

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    Недавно разбирался с похожей проблемой, а именно если окну посылать нажатия F12 то под отладчиком создаётся поток(ядром гуя, те независимо от того, какой отладчик). Вот только установить фокус для отправки сообщения не получается стабильно, работает если сканкоды в поток ввода добавлять(sendinput etc).

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

    UbIvItS Well-Known Member

    Blog Posts:
    0
    Joined:
    Jan 5, 2007
    Messages:
    6,242
    любая ось позволяет отнимать фокус == единственный способ прекратить такое безобразие еть отключить приложухи с такими хулиганскими наклонностями иль перенастроить их. Так что TermoSINteZ сказал верно == надо найти хулиганов и выяснить причину их поведения. кстати, вирии таким баловаться могут.
     
  15. _DEN_

    _DEN_ DEN

    Blog Posts:
    0
    Joined:
    Oct 8, 2003
    Messages:
    5,383
    Location:
    Йобастан
    Подозреваю что если в макоси приложение будет отнимать фокус, то его быстренько погонят из аппстора ссаной метлой :)
     
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    _DEN_, так отнимает же не ОС а приложение.
    Тут получается ОСЬ не виновата.
    ПРосто в Апсторе вероятно лучше приложения тестируют.
    Это не достоинство макос .
     
    UbIvItS and Indy_ like this.
  17. UbIvItS

    UbIvItS Well-Known Member

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

    Paguo_86PK Руслан

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

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

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