Мотивация: Я использую программное обеспечение, которое не имеет API для взаимодействия с ... У меня нет альтернативы, и мне нужно открыть программное обеспечение, отправить простую последовательность клавиш, а затем закрыть .. Снова и снова, поэтому я хочу автоматизировать этот процесс.
Цель: Отправить комбинации вводов с клавиатуры в неактивное окно.
Прогресс: Я написал сценарий PowerShell, который открывает, отправляет ключи, ждет, а затем завершает процесс, но он работает только в активном окне. Часть кода PowerShell выглядит следующим образом.
$appProcess = Start-Process -FilePath $path -PassThru
$wshell = New-Object -ComObject wscript.shell;
$wshell.AppActivate($appProcess.Id)
$wshell.SendKeys('%(E)E')
Stop-Process $appProcess -Force
Работает, но только в активном окне (windows выходит наверх). Я хочу запустить автоматизацию окна в фоновом режиме. Я нашел статью , которая указывает мне использовать PostMessage в Win32 API. Поскольку в большей части моего кода используется python, я решил перейти с powershell на pywin32.
Проблема: Я не могу получить PostMessage для отправки ключа в правый обработчик. Я видел в этой статье , что мне может понадобиться найти точное окно, но я до сих пор не понимаю, как это сделать. В PowerShell я могу напрямую отправлять ключи через $ wshell.AppActivate ($ appProcess.Id) .
hwndMain = win32gui.FindWindow(None, winname)
hwndChild = win32gui.GetWindow(hwndMain, win32con.GW_CHILD)
temp = win32api.PostMessage(hwndChild, win32con.WM_KEYDOWN, 0x45, 0)
# temp came out as None
Вопрос: Есть ли способ сделать это в pywin32 / Win32 API?
Изменить: (8 мая 2020 г.) Да, я слышали, что использование SendKeys ненадежно, но поскольку нет альтернативы таким вопросам, как этот, о SO, как кто-то должен научиться «правильному пути»? Если вы считаете, что есть альтернатива, все будут рады увидеть решение в действии. Пожалуйста, предложите отредактировать мой пост, чтобы улучшить качество вопроса, а не сокращать его.