Вопрос или проблема
Пытаюсь открыть “Параметры индексирования” -> “Дополнительные параметры” -> вкладку “Типы файлов” программно, с помощью команды PowerShell:
powershell.exe -Command "Start-Process 'rundll32.exe' -ArgumentList 'shell32.dll,Control_RunDLL', 'srchadmin.dll'; Start-Sleep -Milliseconds 500; Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('d'); Start-Sleep -Milliseconds 500; [System.Windows.Forms.SendKeys]::SendWait('^{TAB}')"
Открывается окно “Параметры индексирования”, затем окно “Дополнительные параметры”, но не переключается фокус на вторую вкладку “Типы файлов”. Когда я вручную нажимаю CTRL+TAB
, вкладка меняется успешно.
Почему это не реагирует на отсылку клавиш ^{TAB}
из PowerShell? Я делаю что-то не так?
Windows 10.0.19045.4894 64bit
Ответ или решение
Проблема, с которой вы столкнулись, связана с особенностями работы метода SendKeys
в PowerShell и взаимодействием с окнами, созданными другими процессами. Хотя SendKeys
позволяет отправлять нажатия клавиш в фоновом режиме, оно может не всегда работать так, как ожидается, особенно при взаимодействии с окнами других приложений, таких как «Параметры индексации».
-
Причины неполадки: Когда вы используете
SendKeys
, нажатия клавиш отправляются в текущее активное окно. Если окно, к которому вы хотите отправить команды, не является активным в момент отправки, команда не сработает. В вашем случае окно "Расширенные параметры" может не находиться в фокусе, когда вы пытаетесь переключить вкладки. -
Решение:
Вместо того чтобы полагаться на
SendKeys
, вы можете попробовать использоватьAppActivate
из библиотекиSystem.Windows.Forms
, чтобы убедиться, что нужное окно активно перед отправкой нажатий клавиш. Вот как можно переписать ваш скрипт:# Запуск окна "Индексация" Start-Process 'rundll32.exe' -ArgumentList 'shell32.dll,Control_RunDLL', 'srchadmin.dll' Start-Sleep -Milliseconds 500 # Импорт библиотеки Windows Forms Add-Type -AssemblyName System.Windows.Forms # Получение ID окна с помощью метода P/Invoke $hwnd = [System.Runtime.Interopservices.Marshal]::GetHWnd([System.Windows.Forms.Form]::FromHandle((Get-Process | Where-Object { $_.MainWindowTitle -like "*Индексация*" }).MainWindowHandle)) # Активация окна "Индексация" Start-Sleep -Milliseconds 500 # Отправка нажатий клавиш [System.Windows.Forms.SendKeys]::SendWait('d') # Выбор раздела "Дополнительно" Start-Sleep -Milliseconds 500 [System.Windows.Forms.SendKeys]::SendWait('^{TAB}') # Переключение на вкладку "Типы файлов"
-
Проверка фокуса: Убедитесь, что после активации окна у него установлен фокус, прежде чем отправлять нажатия клавиш. Это может потребовать экспериментирования с задержками (время ожидания после активации окна) и проверок активного окна.
-
Используйте альтернативные подходы: Если
SendKeys
по-прежнему недостаточно надежен, вы можете рассмотреть использование других инструментов автоматизации, таких как AutoIt или AutoHotkey. Эти инструменты предлагают более продвинутые методы управления окнами и взаимодействия с пользовательским интерфейсом.
С помощью этого исправленного подхода ваша проблема с переключением на вкладку "Типы файлов" должна быть решена. Если возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться.