Предотвращение кражи приложений

104752
svandragt

Существуют ли какие-либо решения для предотвращения кражи приложений из активного окна?

Это особенно раздражает, когда я запускаю приложение, переключаюсь на что-то еще, и новое приложение начинает получать половину предложения текста.

179
Виста или ХР? Поскольку Vista имеет некоторые известные проблемы с обходными путями Ivo Flipse 14 лет назад 0
@ Ivo Windows 7 в моем случае, но я думаю, что для SuperUser все версии Windows будут актуальны svandragt 14 лет назад 9
У XP есть известное решение, и вопрос http://superuser.com/questions/138648/how-to-disable-auto-focus-of-opened-windows-apps, так что, возможно, этот вопрос должен быть только для Windows 7? endolith 13 лет назад 0
Модератор объединил этот вопрос: http://superuser.com/questions/199821/windows-7-disable-applications-stealing-focus с текущим. Это неправильно, ответ на текущий вопрос не относится к Windows 7, поэтому его не следует объединять. До сих пор я не смог найти решение этой проблемы в Windows 7 Alex Angelico 12 лет назад 2
@AlejandroAngelico: Так как все ответы здесь для Windows-XP, вопросы должны быть разделены и вопрос помечен заново endolith 12 лет назад 0
@sathya ... в качестве ссылки [этот форум] (http://answers.microsoft.com/en-us/windows/forum/windows_7-windows_programs/applications-stealing-focus-reg-key-no-longer/4ee5be7d -31ef-493b-b092-f6f6139f99cd) утверждает, что нет никакого способа. Однако я не смог найти упомянутое там сообщение в блоге. KronoS 12 лет назад 0
Это одна из моих любимых мозолей номер один с каждым графическим интерфейсом, который я когда-либо использовал. Вы печатаете и раздаете, какое-то громкое диалоговое окно крадет фокус, а половина ваших нажатий куда-то еще. Вы могли бы подумать, что разработчики оконных систем выяснили бы это десятилетия назад. Если в окне есть активность, отложите показ нового окна. Например, ничего не всплывать в GUI до трех или четырех секунд с момента последнего нажатия кнопки или нажатия клавиши в текущем окне. Doh! Kaz 12 лет назад 16
я обнаружил, что когда мой внешний жесткий диск (производства Seagate) или мой ipod nano (ahem, apple) подключен к моей машине с Windows 7, кажется, что «рабочий стол» крадет фокус каждые 30 секунд или около того, что когда-либо я просматривал, будь то музыка itunes, результаты поиска Chrome или электронные письма Firefox. Я отключил функцию автозапуска, и это помогло на некоторое время, но проблема вернулась даже после отключения автозапуска. Я думаю, что я должен держать мои внешние HD и флеш-накопители по большей части отключенными, что отстой, потому что там вся моя музыка :( Это действительно раздражающая ошибка, которая заставляет меня хотеть S 11 лет назад 1
@harrymc: Да, я посмотрел на все ответы. Похоже, что нет реального решения для Windows 7. endolith 11 лет назад 0
Также смотрите действительно длительное обсуждение этой проблемы [здесь] (http://answers.microsoft.com/en-us/windows/forum/windows_7-windows_programs/applications-stealing-focus-reg-key-no-longer/4ee5be7d- 31ef-493b-B092-f6f6139f99cd). Karan 11 лет назад 0
`Это особенно раздражает, когда я запускаю приложение, переключаюсь на что-то еще, и новое приложение начинает получать половину предложения текста. Это еще более раздражает, когда появляется диалоговое окно, и вы непреднамеренно отклоняете его, даже не видя сообщения потому что вы случайно нажали `Space` или` Enter` при вводе предложения. Synetech 10 лет назад 18
The Java installer is an example. I can be typing into my IM window whilst the Java installer is running, and suddenly my keyboard focus is whisked away as Java's command-line opens the command prompt box. Other installers do this too, they can't just run in the background (yes, I know, they always say "close all other windows first" - but there's no reason to do that - I believe this requirement is a relic of XP or earlier). bgmCoder 7 лет назад 0
Это на самом деле более чем раздражает, я бы сказал, что это угроза безопасности. Ничто не мешает приложению всплывать, когда вы набираете пароль и перехватываете ввод. Chris Peacock 7 лет назад 2
@Synetech - да, особенно если это приглашение «Перезагрузить Windows сейчас, чтобы применить обновления», которое затем происходит без подтверждения и без возможности отмены. Chris Peacock 7 лет назад 1

6 ответов на вопрос

45
Der Hochstapler

Это невозможно без интенсивных манипуляций с внутренними компонентами Windows, и вам нужно преодолеть это.

В повседневном использовании компьютера бывают моменты, когда очень важно выполнить одно действие, прежде чем операционная система позволит вам выполнить другое. Для этого нужно заблокировать фокус на определенных окнах. В Windows контроль над этим поведением в основном остается за разработчиками отдельных программ, которые вы используете.

Не каждый разработчик принимает правильные решения, когда речь заходит об этой теме.

Я знаю, что это очень расстраивает и раздражает, но вы не можете съесть свой пирог и съесть его тоже. Вероятно, в вашей повседневной жизни есть много случаев, когда вы совершенно в порядке с фокусом, перемещенным на определенный элемент пользовательского интерфейса или с приложением, запрашивающим, чтобы фокус оставался на нем. Но большинство приложений примерно одинаковы, когда речь заходит о том, кто сейчас является лидером, и система никогда не может быть идеальной.

Некоторое время назад я провел обширные исследования по решению этой проблемы раз и навсегда (и не смог). Результат моего исследования можно найти на странице проекта раздражения .

Проект также включает в себя приложение, которое неоднократно пытается захватить фокус, вызывая:

switch( message ) { case WM_TIMER: if( hWnd != NULL ) { // Start off easy // SetForegroundWindow will not move the window to the foreground, // but it will invoke FlashWindow internally and, thus, show the // taskbar. SetForegroundWindow( hWnd );  // Our application is awesome! It must have your focus! SetActiveWindow( hWnd );  // Flash that button! FlashWindow( hWnd, TRUE ); } break; 

Как видно из этого фрагмента, мои исследования были также сосредоточены на других аспектах поведения пользовательского интерфейса, которые мне не нравятся.

Я пытался решить эту проблему, загружая DLL в каждый новый процесс и перехватывая вызовы API, которые вызывают активацию других окон.
Последняя часть проста благодаря удивительным библиотекам перехвата API. Я использовал очень большую библиотеку mhook :

#include "stdafx.h" #include "mhook-2.2/mhook-lib/mhook.h"  typedef NTSTATUS( WINAPI* PNT_QUERY_SYSTEM_INFORMATION ) (  __in SYSTEM_INFORMATION_CLASS SystemInformationClass,  __inout PVOID SystemInformation,  __in ULONG SystemInformationLength,  __out_opt PULONG ReturnLength  );  // Originals PNT_QUERY_SYSTEM_INFORMATION OriginalFlashWindow =  (PNT_QUERY_SYSTEM_INFORMATION)::GetProcAddress(  ::GetModuleHandle( L"user32" ), "FlashWindow" );  PNT_QUERY_SYSTEM_INFORMATION OriginalFlashWindowEx =  (PNT_QUERY_SYSTEM_INFORMATION)::GetProcAddress(  ::GetModuleHandle( L"user32" ), "FlashWindowEx" );  PNT_QUERY_SYSTEM_INFORMATION OriginalSetForegroundWindow =  (PNT_QUERY_SYSTEM_INFORMATION)::GetProcAddress(  ::GetModuleHandle( L"user32" ), "SetForegroundWindow" );  // Hooks BOOL WINAPI HookedFlashWindow( __in HWND hWnd, __in BOOL bInvert ) { return 0; }  BOOL WINAPI  HookedFlashWindowEx( __in PFLASHWINFO pfwi ) { return 0; }  BOOL WINAPI  HookedSetForegroundWindow( __in HWND hWnd ) { // Pretend window was brought to foreground return 1; }   BOOL APIENTRY  DllMain(  HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch( ul_reason_for_call ) { case DLL_PROCESS_ATTACH: Mhook_SetHook( (PVOID*)&OriginalFlashWindow, HookedFlashWindow ); Mhook_SetHook( (PVOID*)&OriginalFlashWindowEx, HookedFlashWindowEx ); Mhook_SetHook( (PVOID*)&OriginalSetForegroundWindow, HookedSetForegroundWindow ); break;  case DLL_PROCESS_DETACH: Mhook_Unhook( (PVOID*)&OriginalFlashWindow ); Mhook_Unhook( (PVOID*)&OriginalFlashWindowEx ); Mhook_Unhook( (PVOID*)&OriginalSetForegroundWindow ); break; } return TRUE; } 

Из моих тестов тогда это работало отлично. За исключением части загрузки DLL в каждый новый процесс. Как можно себе представить, это не слишком легко. Тогда я использовал подход AppInit_DLLs (которого просто недостаточно).

В принципе, это прекрасно работает. Но я так и не нашел время написать что-то, что правильно внедрит мою DLL в новые процессы. И время, потраченное на это, в значительной степени омрачает раздражение, которое вызывает кража фокуса.

В дополнение к проблеме внедрения DLL, есть также метод кражи фокуса, который я не рассматривал при реализации в Google Code. Сотрудник действительно провел дополнительное исследование и рассказал об этом методе. Проблема обсуждалась на SO: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-focus

Как вы думаете, это ваше решение может быть перенесено на Java? Я искал и задавал вопросы, но ничего не нашел. Может быть, я мог бы импортировать саму библиотеку хуков в java, используя `jne`? Tomáš Zato 9 лет назад 0
@ TomášZato: Понятия не имею. Я не активно использую этот код сам. Der Hochstapler 9 лет назад 0
Я пытаюсь по крайней мере скомпилировать его как C ++ (а затем внедрить / удалить скомпилированную DLL из Java). Но это тоже не слишком хорошо. Я не хочу обсуждать это здесь в комментариях, но если бы вы могли реально помочь мне заставить его работать, я был бы очень изящен! Я создал чат, если я заставлю это работать, я опубликую комментарий, как это сделать здесь: http://chat.stackexchange.com/rooms/21637/preventing-applications-from-stealing-focus-using-mhook Tomáš Zato 9 лет назад 0
23
Tom Wijsman

В Windows 7 ForegroundLockTimeoutзапись реестра больше не проверяется, это можно проверить с помощью Process Monitor. Фактически, в Windows 7 они запрещают вам изменять окно переднего плана. Пойдите и прочитайте о его деталях, это было даже там с Windows 2000.

Тем не менее, документация отстой, и они преследуют друг друга и находят способы обойти это .

Итак, происходит что-то глючное SetForegroundWindowили похожие API-функции ...

Единственный способ действительно сделать это правильно - это создать небольшое приложение, которое периодически вызывает LockSetForegroundWindow, фактически отключая любые вызовы нашей глючной функции API.

Если этого недостаточно (еще один ошибочный вызов API?), Вы можете пойти еще дальше и провести некоторый мониторинг API, чтобы увидеть, что происходит, а затем просто перехватить вызовы API для каждого процесса, после чего вы можете избавиться от любых вызовов, которые могут испортить на переднем плане. Однако, по иронии судьбы, это не одобряется Microsoft ...

Я постараюсь написать приложение, которое периодически вызывает `LockSetForegroundWindow`, в эту пятницу / выходные. Учитывая, что уже есть исправления, которые работают для Windows XP и 7, я не ожидаю, что что-то будет работать для Windows 7 в общем виде ... Tom Wijsman 12 лет назад 0
Привет, Том, возможно, этот мой старый проект даст тебе преимущество :) http://code.google.com/p/annoyance/ Der Hochstapler 12 лет назад 0
@OliverSalzburg: я знаю об этом. Последняя строка в моем сообщении ... ^^ Tom Wijsman 12 лет назад 0
** Есть ли у кого-нибудь воспроизводимый вариант использования этого в Windows 7? ** Учитывая, что люди скорее испытывают обратное (например, я часто нахожу требовательную Windows скрытой за моим текущим окном), и что мне еще предстоит увидеть это в Windows 7 было бы довольно неприятно писать приложение, но не могло его протестировать. Более того, поскольку Microsoft заявляет, что это больше не должно происходить с Windows 7. В лучшем случае люди обнаружили, что она может переключать фокус клавиатуры только случайно, этот вызов API мог бы это исправить, но я не знаю, как проверить, действительно ли она работает .. , Tom Wijsman 12 лет назад 3
У меня есть похожая проблема, которая чертовски раздражает меня. Довольно сложный установщик, который вызывает другие программы во время установки (например, некоторая инициализация службы). Печатать в другой программе / окне во время этой последней части установки невозможно. Это воспроизводимо каждый раз, к сожалению, я не могу поделиться оскорбительным приложением. Я был бы готов проверить ваш обходной путь, хотя. Daniel Beck 12 лет назад 0
@DanielBeck: Хмм, какие окна всплывают? Было бы очень интересно посмотреть, будут ли окна консоли или сам Windows Installer нарушать их собственные правила. Кроме того, возможно, что новые приложения могут работать вокруг правила. Но хотелось бы знать, появляется ли что-то общее, а не их собственный установщик, так как это было бы довольно легко воспроизвести ... Tom Wijsman 12 лет назад 0
Установщик (на основе InnoSetup) запускает другие процессы и, возможно, другие (скрытые) установки, но я не знаю, на каком создателе установки они основаны. Daniel Beck 12 лет назад 1
@ TomWijsman: Откройте regedit, найдите случайный текст, который не будет найден. Зайдите в другое приложение и начните печатать. Когда поиск будет завершен, regedit украдет фокус. endolith 11 лет назад 5
@endolith: Невозможно воспроизвести, используя Windows 8 Replase Preview здесь. Какую ОС вы используете? В моем случае это просто выдвигает на первый план приложение, но не прерывает мой просмотр ... Tom Wijsman 11 лет назад 1
Также не поддерживается в Windows 7 ([подтверждено Сатьей] (http://chat.stackexchange.com/transcript/message/4857861#4857861)). Tom Wijsman 11 лет назад 0
@endolith Я смог воспроизвести его на Windows 7 (64-разрядная версия). Смотрите: http://chat.stackexchange.com/transcript/message/4858025#4858025 iglvzx 11 лет назад 1
@endolith: Я думаю, что повышенный процесс может (по крайней мере, в Windows 7), хотя Сатья не мог. Это имеет смысл для администратора, чтобы иметь возможность сделать это ... Tom Wijsman 11 лет назад 1
Да, Win7 Pro 64-битная. А кража фокуса еще хуже для повышенных процессов, так как они фиксируют ваше нажатиекогда они не должны, и вы говорите это, чтобы шланг вашей системы случайно. Ничто не должно * когда-либо * быть способным украсть фокус. endolith 11 лет назад 21
@Tom: это происходит со мной регулярно (даже сейчас, когда пишу этот комментарий). У меня Windows 7 32 битная. В фоновом режиме запущено приложение, которое периодически создает дочерний процесс через вызов CreateProcess. Этот дочерний процесс выходит на передний план и крадет фокус клавиатуры. Но не всегда, скажем, в 50% случаев. Упомянутое приложение разрабатывается мной и моими коллегами. Я не пытался воспроизвести кражу фокуса, написав небольшое демонстрационное приложение, но видел эту проблему десятки, может быть, сотни раз. truthseeker 10 лет назад 1
Скопируйте что-нибудь в Windows Explorer (между дисками, 1 ГБ, занимает 2-3 минуты). Когда копирование закончено, он крадет фокус. Windows 7 Home Basic 64-разрядная LGT 7 лет назад 0
18
Simon P Stevens

В TweakUI есть опция, которая делает это. Это предотвращает большинство обычных уловок, которые сомнительные разработчики программного обеспечения используют, чтобы заставить их сосредоточиться на своем приложении.

Хотя это продолжающаяся война за оружие, поэтому я не знаю, работает ли она на все.

Обновление : Согласно EndangeredMassa, TweakUI не работает в Windows 7.

Tweakui совместим с Windows 7? frankster 14 лет назад 2
@frankster. Понятия не имею, извините, я подозреваю, что это не так. Загрузите и попробуйте. Сообщите, если вы сделаете так, чтобы все знали. Simon P Stevens 14 лет назад 0
Даже использование настроек реестра, которые устанавливает TweakUI, не работает на Win7. EndangeredMassa 13 лет назад 4
@EndangeredMassa, какой раздел реестра это? n611x007 11 лет назад 0
Раздел реестра: HKEY_CURRENT_USER \ Панель управления \ Рабочий стол \ ForegroundLockTimeout (в миллисекундах). И да, это больше не работает в Windows 7. foo 10 лет назад 1
`В TweakUI есть опция, которая делает это. * Какая * опция? Там их много. Synetech 10 лет назад 0
14
harrymc

Я полагаю, что некоторая путаница может существовать, поскольку есть два способа «украсть фокус»: (1) окно, выходящее на передний план, и (2) окно, принимающее нажатия клавиш.

Проблема, о которой здесь говорится, является, вероятно, второй, когда окна требуют фокусировки, выдвигая себя на передний план - без запроса или разрешения пользователя.

Дискуссия должна быть разделена между XP и 7.

Windows XP

В XP есть взлом реестра, который заставляет XP работать так же, как Windows 7 в предотвращении кражи приложений:

  1. Используйте редактор реестра для перехода на: HKEY_CURRENT_USER\Control Panel\Desktop.
  2. Дважды щелкните ForegroundLockTimeoutи установите его значение в шестнадцатеричном виде на 30d40.
  3. Нажмите OK и выйдите из программы regedit.
  4. Перезагрузите компьютер, чтобы изменения вступили в силу.

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 воспроизводится:

Declare Auto Function GetForegroundWindow Lib "user32.dll" () As Integer Declare Auto Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Integer, ByRef procid As Integer) As UInteger  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.RichTextBox1.AppendText("Starting up at " & Now & vbCrLf) End Sub  Private Sub GoingAway(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate, Me.LostFocus  Dim hwnd As Integer = GetForegroundWindow() ' Note that process_id will be used as a ByRef argument ' and will be changed by GetWindowThreadProcessId Dim process_id As Integer = 1 GetWindowThreadProcessId(hwnd, process_id)  If (process_id <> 1) Then Dim appExePath As String = Process.GetProcessById(process_id).MainModule.FileName()  Me.RichTextBox1.AppendText("Lost focus at " & Now & " due to " & appExePath & vbCrLf) Else Me.RichTextBox1.AppendText("Lost focus due to unknown cause.") End If  End Sub 
«Если это окно заблокировано, вы никогда не поймете, почему копия никогда не заканчивается». Это не правда. Правильное поведение - уведомлять пользователя мигающим значком на панели задач (или, возможно, всплывающим окном или уведомлением о тостере или чем-то еще). Если пользователь прерывает окно, которое перехватывает его нажатие, это означает, что антивирусное программное обеспечение сообщает случайному или иному действию. Определенно не хороший способ сделать что-то. endolith 11 лет назад 43
К сожалению, Windows не делает это методично во всех случаях. Поэтому приходится прибегать к обходным решениям или сторонним продуктам. harrymc 11 лет назад 0
* «если это окно заблокировано, вы никогда не поймете, почему копия никогда не заканчивается». Это не так. Правильное поведение - уведомлять пользователя мигающим значком на панели задач ... * Были случаи, когда я нажимал кнопку или что-то в работающей программе, что приводило к созданию нового модального диалога (например, * открытый файл *) , но затем я переключаюсь на другую программу перед созданием диалога. В результате диалоговое окно скрыто, и к другой программе нельзя переключиться, и диалоговое окно нельзя закрыть. Ни ее кнопка на панели задач, ни `Alt-Tab` не работают; только заставляя диалоговое окно вперед. Synetech 11 лет назад 1
@Synetech: Иногда единственное решение для внешнего интерфейса - убить задачу. Алгоритмы фокусировки в Windows действительно паршивые. harrymc 11 лет назад 1
@harrymc, мне никогда не придется прибегать к убийству одного из приложений. Я просто запускаю свою программу для работы с окнами ([WinSpy ++] (http://www.catch22.net/software/winspy-17) делает замечательный трюк) и скрываю окно впереди, затем я могу отклонить задержку возврата диалоговое окно, а затем снова показать скрытое окно. Это не удобно, но это лучше, чем убивать любой из процессов. Synetech 11 лет назад 2
@Synetech: Он действительно выпускает немного пара ... Честно говоря, повторения Alt-Tab несколько раз обычно достаточно, чтобы исправить проблему. harrymc 11 лет назад 0
@harrymc, не совсем; уничтожение приложения и потеря материала просто делают больше, и если это модальное диалоговое окно (которое блокирует родительское окно и не имеет кнопки панели задач), то оно не будет отображаться в списке `Alt + Tab`, а в моем опыт показывает, что окно, в котором открыто модальное диалоговое окно, не всегда (никогда?) не отображает модальное диалоговое окно с `Alt + Tab`, особенно если в диалоге никогда не было изменений, чтобы получить фокус. `: - |` Synetech 11 лет назад 1
Код VB еще где-то существует? Ссылка вроде битая Superole 9 лет назад 0
@Superole: я добавил код в ответ. harrymc 9 лет назад 0
@harrymc: здорово :) теперь, если бы я мог просто понять, как его использовать ... Я попытался скомпилировать его с помощью vbc, но там написано, что Sub Main не найден. Superole 9 лет назад 0
@Superole: Вы также можете использовать другие продукты, такие как утилита AutoHotKey Windows Spy. Или используйте C # с [этой программой] (http://adrianswall.com/?p=193). harrymc 9 лет назад 0
Есть ли способ злоупотребить объектом focus-follow-mouse, например, вторым виртуальным невидимым курсором мыши, который следует за тем, где находится фокус в данный момент? endolith 9 лет назад 0
@endolith: AFAIK, очень трудно иметь 2 курсора в Windows. Я действительно предлагаю поискать другое решение вашей проблемы, возможно, в новом посте. harrymc 9 лет назад 0
Это будет закрыто как дубликат этого поста endolith 9 лет назад 0
@endolith: Я имел в виду основную проблему, которая мотивировала ваше решение о 2 курсорах. Это может иметь другое решение, чем 2 курсора. harrymc 9 лет назад 0
Я не понимаю Проблема в том, что окна появляются и крадут фокус. В качестве решения вы предложили сфокусироваться за мышью, но для этого необходимо вручную навести указатель мыши на окно, которое вы используете постоянно. Мне интересно, может ли это быть автоматизировано в качестве обходного пути для этой ошибки Windows. endolith 9 лет назад 0
@endolith: Возможно, используя AutoHotKey или подобное. harrymc 9 лет назад 0
2
Ivo Flipse

У Гакса есть возможное решение:

Несколько раз в день некоторые приложения крадут фокус активного окна, всплывая. Это может произойти по ряду причин, например, когда я извлекаю файлы или передача завершается. В большинстве случаев это не имеет значения, но иногда я пишу статью, и это означает не только то, что я должен снова набрать несколько слов, но и то, что я потерял концентрацию и должен щелкнуть, чтобы восстановить фокус.

На веб-сайте Pro Reviewer есть советы о том, как этого избежать. Самый простой способ предотвратить кражу фокуса - использовать Tweak UI с настройкой, которая называется «Запретить краже приложений». Установка этой опции предотвращает внезапное появление других приложений и захватывает фокус окна, в котором вы сейчас работаете.

Это работает только тогда, когда приложение было свернуто раньше. Вместо кражи фокуса он будет мигать несколько раз, что можно определить в том же меню в пользовательском интерфейсе Tweak . Если вы не хотите использовать Tweak UI, вы можете изменить настройки в реестре Windows.

Перейдите к разделу реестра HKEY_CURRENT_USER> Панель управления> Рабочий стол и измените значение ForegroundLockTimeout на 30d40 (шестнадцатеричное) или 200000 (десятичное). Ключ ForeGroundFlashCount определяет количество вспышек окна, чтобы предупредить пользователя, где 0 означает неограниченный.

Это не работает ни на одной ОС после XP. Это значение реестра уже установлено (по-моему, по умолчанию) и не работает в любом случае. EndangeredMassa 13 лет назад 19
Во-вторых, я нахожусь на Windows 7 (64-разрядная версия), у меня происходит кража фокуса (VS 2012, когда наконец-то активен, например), и предложенное выше предложение реестра уже на месте. Техническое подтверждение в этом ответе: http://superuser.com/a/403554/972 Michael Paulukonis 10 лет назад 0
0
blade

Вдохновленный ответом Der Hochstapler, я решил написать DLL-инжектор, который работает как с 64, так и с 32-битными процессами и предотвращает кражу фокуса в Windows 7 или новее: https://blade.sk/stay-focused/

Он работает так, как SetWinEventHookбудто наблюдает за вновь созданными окнами (используя ) и внедряет DLL, очень похожую на библиотеку Der Hochstapler, в процесс окна, если его еще нет. Он выгружает библиотеки DLL и восстанавливает исходную функциональность при выходе.

Судя по моим тестам, пока все работает очень хорошо. Тем не менее, проблема, кажется, идет глубже, чем просто вызов приложений SetForegroundWindow. Например, когда создается новое окно, оно автоматически выводится на передний план, что также мешает пользователю печатать в другом окне.

Чтобы справиться с другими методами кражи фокуса, требуется дополнительное тестирование, и я буду признателен за любые отзывы о сценариях, где это происходит.