Я полагаю, что некоторая путаница может существовать, так как есть два способа «украсть фокус»: (1) окно, выходящее на передний план, и (2) окно, принимающее нажатия клавиш.
Проблема, о которой здесь говорится, является, вероятно, второй, когда окна требуют фокусировки, выдвигая себя на передний план - без запроса или разрешения пользователя.
Дискуссия должна быть разделена между XP и 7.
Windows XP
В XP есть взлом реестра, который заставляет XP работать так же, как Windows 7 в предотвращении кражи приложений:
- Используйте редактор реестра для перехода на:
HKEY_CURRENT_USER\Control Panel\Desktop
.
- Дважды щелкните
ForegroundLockTimeout
и установите его значение в шестнадцатеричном виде 30d40
.
- Нажмите OK и выйдите из программы regedit.
- Перезагрузите компьютер, чтобы изменения вступили в силу.
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