win32gui.FindWindow Не находит окно

Я пытаюсь отправить нажатие клавиши в неактивное окно TeraTerm, используя Pywin32.

Этот ответ заставил меня написать этот код:

import win32gui
import win32con
import win32api

hwndMain = win32gui.FindWindow("Tera Term VT", None)
print hwndMain
hwndChild = win32gui.GetWindow(hwndMain, win32con.GW_CHILD)
win32api.PostMessage(hwndChild, win32con.WM_CHAR, 0x5b, 0)

но:
hwndMain = win32gui.FindWindow("Tera Term VT", None) возвращает 0, окно не может быть найдено.

Если я изменю "Tera Term VT" на "Notepad", я могу с радостью отправлять нажатия клавиш в активное окно Блокнота в течение всего дня. Итак, почему я не могу получить окно TeraTerm?

Согласно документации ActiveState:

PyHANDLE = FindWindow (имя класса, имя окна)

ClassName : PyResourceId Имя или атом класса окна, который нужно найти, может быть None
WindowName : строка Заголовок окна, которое нужно найти, может быть None

Итак, как я могу использовать правильное имя класса?

Я пробовал почти все варианты Tera Term VT, избегая пробелов: "Tera\ Term\ VT", заключая все в одинарные кавычки: "'Tera Term VT'", но ничего не работает. Я даже пытался использовать имя процесса: "ttermpro.exe" и в отчаянии включил дочернее имя в строку "COM11:115200baud - Tera Term VT", но ничего не работает.

Интересно, это:

import win32com.client

shell = win32com.client.Dispatch("WScript.Shell")
shell.AppActivate("Tera Term VT")
shell.SendKeys("\%i", 0)

работает просто отлично, но выводит окно на передний план, чего я не хочу. Однако в этом случае строка Tera Term VT работает нормально.


person SiHa    schedule 16.08.2016    source источник


Ответы (1)


Линия

shell.AppActivate("Tera Term VT")

работает с заголовком окна и, следовательно, работает.
Вы должны иметь возможность сделать то же самое с

hwndMain = win32gui.FindWindow(None, "Tera Term VT")  

то есть поменять местами аргументы, чтобы он также работал на основе заголовка окна

Если вы хотите работать на основе имени класса окна, вы можете использовать такой инструмент, как Spy++ с его Инструмент Finder для выбора окна Tera Term и получения имени класса окна из свойств

person DAXaholic    schedule 16.08.2016
comment
Увы, замена аргументов не помогает. Я изучу инструмент Finder. хотя. Спасибо. - person SiHa; 16.08.2016
comment
Тогда название не совсем соответствовало Tera Term VT в то время, я думаю - может быть, вы можете предоставить скриншот окна. Тем не менее, решение, основанное на имени класса окна, в любом случае лучше, так как приложение может изменить заголовок в любое время. - person DAXaholic; 16.08.2016
comment
Спасибо, сегодня я кое-что узнал; Оконные классы для меня в новинку! Загрузил WinSpy++ и обнаружил, что класс на самом деле VTWin32, и это работает отлично. - person SiHa; 16.08.2016