Есть ли какие-нибудь решения для предотвращения кражи приложений из активного окна?
Это особенно раздражает, когда я запускаю приложение, переключаюсь на что-то еще, и новое приложение начинает получать половину предложения текста.
windows
window-focus
svandragt
источник
источник
This is especially annoying when I'm starting an application, switch to do something else and the new application starts receiving half a sentence of text.
Это еще более раздражает, когда всплывает диалоговое окно, и вы непреднамеренно отклоняете его, даже не видя сообщения, потому что вы случайно нажалиSpace
илиEnter
набрали предложение.Ответы:
Это невозможно без обширных манипуляций с внутренними компонентами Windows, и вам нужно преодолеть это.
В повседневном использовании компьютера бывают моменты, когда очень важно выполнить одно действие, прежде чем операционная система позволит вам выполнить другое. Для этого нужно заблокировать фокус на определенных окнах. В Windows контроль над этим поведением в основном остается за разработчиками отдельных программ, которые вы используете.
Не каждый разработчик принимает правильные решения, когда речь заходит об этой теме.
Я знаю, что это очень расстраивает и раздражает, но вы не можете съесть свой пирог и съесть его тоже. Вероятно, в вашей повседневной жизни есть много случаев, когда вы совершенно в порядке с переносом фокуса на определенный элемент пользовательского интерфейса или с приложением, запрашивающим его фиксацию. Но большинство приложений примерно одинаковы, когда дело доходит до решения, кто является лидером прямо сейчас, и система никогда не может быть идеальной.
Некоторое время назад я провел обширные исследования по решению этой проблемы раз и навсегда (и не смог). Результат моего исследования можно найти на странице проекта раздражения .
Проект также включает в себя приложение, которое неоднократно пытается захватить фокус, вызывая:
Как видно из этого фрагмента, мои исследования были также сосредоточены на других аспектах поведения пользовательского интерфейса, которые мне не нравятся.
Я пытался решить эту проблему, загружая DLL в каждый новый процесс и перехватывая вызовы API, которые вызывают активацию других окон.
Последняя часть проста благодаря удивительным библиотекам перехвата API. Я использовал очень большую библиотеку mhook :
Из моих тестов тогда это работало отлично. За исключением части загрузки DLL в каждый новый процесс. Как можно себе представить, это не слишком легко. Тогда я использовал подход AppInit_DLLs (которого просто недостаточно).
В принципе, это прекрасно работает. Но я так и не нашел время написать что-то, что правильно внедрит мою DLL в новые процессы. И время, потраченное на это, в значительной степени омрачает раздражение, которое вызывает кража фокуса.
В дополнение к проблеме внедрения DLL, есть также метод кражи фокуса, который я не рассматривал при реализации в Google Code. Сотрудник действительно провел дополнительное исследование и рассказал об этом методе. Проблема обсуждалась на SO: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-focus
источник
jne
?В Windows 7
ForegroundLockTimeout
запись реестра больше не проверяется, это можно проверить с помощью Process Monitor. Фактически, в Windows 7 они запрещают вам изменять окно переднего плана. Пойдите и прочитайте о его деталях , это было даже там с Windows 2000.Тем не менее, документация отстой, и они преследуют друг друга и находят способы обойти это .
Итак, происходит что-то глючное
SetForegroundWindow
или похожие API-функции ...Единственный способ действительно сделать это правильно - создать небольшое приложение, которое периодически вызывает
LockSetForegroundWindow
, фактически отключая любые вызовы нашей глючной функции API.Если этого недостаточно (еще один ошибочный вызов API?), Вы можете пойти еще дальше и провести некоторый мониторинг API, чтобы увидеть, что происходит, а затем просто перехватить вызовы API для каждого процесса, после чего вы можете избавиться от любых вызовов, которые мешают на переднем плане. Однако, по иронии судьбы, это не одобряется Microsoft ...
источник
В TweakUI есть опция, которая делает это. Это предотвращает большинство обычных уловок, которые сомнительные разработчики программного обеспечения используют, чтобы сосредоточиться на своем приложении.
Это война вооружений, поэтому я не знаю, работает ли она на все.
Обновление : Согласно EndangeredMassa , TweakUI не работает в Windows 7.
источник
Я полагаю, что некоторая путаница может существовать, так как есть два способа «украсть фокус»: (1) окно, выходящее на передний план, и (2) окно, принимающее нажатия клавиш.
Проблема, о которой здесь говорится, является, вероятно, второй, когда окна требуют фокусировки, выдвигая себя на передний план - без запроса или разрешения пользователя.
Дискуссия должна быть разделена между XP и 7.
Windows XP
В XP есть взлом реестра, который заставляет XP работать так же, как Windows 7 в предотвращении кражи приложений:
HKEY_CURRENT_USER\Control Panel\Desktop
.ForegroundLockTimeout
и установите его значение в шестнадцатеричном виде30d40
.Windows 7
(Обсуждение ниже в основном относится и к XP.)
Пожалуйста, поймите, что никоим образом Windows не может полностью блокировать приложения от кражи фокуса и оставаться функциональной. Например, если во время копирования файла антивирус обнаружил возможную угрозу и хотел бы открыть окно с просьбой предпринять действия, если это окно заблокировано, вы никогда не поймете, почему копирование никогда не прекращается.
В Windows 7 возможна только одна модификация поведения самой Windows, которая заключается в использовании хаков реестра MS-Windows focus-follow-mouse , где фокус и / или активация всегда выполняются в окнах под курсором. Можно добавить задержку, чтобы приложения не появлялись по всему рабочему столу.
Смотрите эту статью: Windows 7 - при наведении курсора мыши окно становится активным - включается .
В противном случае необходимо обнаружить и нейтрализовать виновную программу: если это всегда одно и то же приложение, которое получает фокус, то это приложение запрограммировано на получение фокуса, и предотвратить это можно, либо отключив его запуск с компьютера, либо используйте некоторые настройки, предоставляемые этим приложением, чтобы избежать такого поведения.
Вы можете использовать сценарий VBS, включенный в код VB, который определяет, кто ворует фокус , который автор использовал для определения виновника как средства обновления «call home» для программного обеспечения принтера.
Отчаянная мера, когда все остальное терпит неудачу, и если вы определили это плохо запрограммированное приложение, состоит в том, чтобы свести его к минимуму и надеяться, что тогда он не окажется на переднем плане. Более сильная форма минимизации - использование лотка с помощью одного из бесплатных продуктов, перечисленных в Best Free Application Minimizer .
Последняя идея в порядке отчаяния состоит в том, чтобы виртуально сломать ваш рабочий стол, используя такой продукт, как Desktops или Dexpot , и выполнять свою работу на другом рабочем столе, чем по умолчанию.
[РЕДАКТИРОВАТЬ]
Когда Microsoft удалила архивную галерею, приведенный выше код VB воспроизводится:
источник
Alt-Tab
работает; только заставляя диалоговое окно вперед.Alt+Tab
списке, и, по моему опыту, окно, которое если модальное диалоговое окно открыто, не всегда (никогда?) не отображается модальное диалоговое окноAlt+Tab
, особенно если в диалоге никогда не было изменений, чтобы получить фокус.:-|
У Гакса есть возможное решение:
источник
Вдохновленный ответом Der Hochstapler , я решил написать DLL-инжектор, который работает как с 64, так и с 32-разрядными процессами и предотвращает кражу фокуса в Windows 7 или новее: https://blade.sk/stay-focused/
Он работает так, как
SetWinEventHook
будто наблюдает за вновь созданными окнами (используя ) и внедряет DLL, очень похожую на библиотеку Der Hochstapler, в процесс окна, если его еще нет. Он выгружает библиотеки DLL и восстанавливает исходную функциональность при выходе.Судя по моим тестам, пока все работает очень хорошо. Тем не менее, проблема, кажется, идет глубже, чем просто вызов приложений
SetForegroundWindow
. Например, когда создается новое окно, оно автоматически выводится на передний план, что также мешает пользователю печатать в другом окне.Чтобы иметь дело с другими методами кражи фокуса, требуется дополнительное тестирование, и я буду признателен за любые отзывы о сценариях, где это происходит.
источник
Я выяснил, как остановить на панели задач мигание вновь активированного целевого окна после того, как вы программно активируете, максимизируете и фокусируете главное окно этого процесса на другом процессе. Прежде всего, существует множество ограничений на то, будет ли разрешена эта операция.
Поэтому, если процесс управления находится на переднем плане, он может временно разрешить другому процессу полностью украсть передний план, вызвав AllowSetForegroundWindow с идентификатором процесса целевого процесса. Затем после этого целевой процесс может вызвать сам SetForegroundWindow , используя свой собственный дескриптор окна, и он будет работать.
Очевидно, что это требует некоторой координации между двумя процессами, но это работает, и если вы делаете это для реализации приложения с одним экземпляром, которое перенаправляет все запуски Explorer-click в существующий экземпляр приложения, то вы уже иметь (например) именованный канал для координации вещей в любом случае.
источник