2013-03-14 3 views
1

Я предопределю это, сказав, что я очень неопытен с python, и я надеюсь, это означает, что решение моей проблемы будет простым.Переключение Windows с Python

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

Я вполне уверен, что могу добиться этого с помощью win32gui с помощью find_window и установки его на передний план. Я думал, что нашел свое решение, когда я наткнулся на этот предыдущий вопрос: Python Window Activation

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

-The образом, пользователь определил find_window, только позволяет вам выбирать по имени класса окна, которое я не знаю и не смог найти, поскольку это просто игра, работающая на Java. Кажется, я не могу изменить эту строку для работы для определенного windowname (что я знаю), поскольку это не «аргумент по умолчанию».

-I не хочу перечислять окна, чтобы найти его, поскольку я не уверен, как это сработает.

-using find_window_wildcard, поскольку он написан в этом скрипте, несколько раз выводил окно на передний план, но только если окно уже открыто и работает только с перерывами.

-set_foreground() требует одного оператора ввода и независимо от того, как я пытаюсь его установить. Мне всегда дается ошибка, когда у меня либо есть неправильное количество элементов, либо неправильный дескриптор в окне.

Я знаю, что я глуп; но ясное и сжатое решение этой проблемы или, по крайней мере, хорошее объяснение синтаксиса find_window/getwindow было бы находкой для меня и для всех, у кого возникла эта проблема.

+0

Если вы не знаете, как получить доступ к определенному окну, вы должны перечислить окна и попытаться найти имя окна, которое вы ищете. – thkang

ответ

1

Таким образом, что пользователь определил find_window только позволяет выбрать на имя класса окна

То, как пользователь определил его, чтобы передать два параметра class_name и window_name через нетронутым, чтобы win32gui.FindWindow (который, в свою очередь, просто вызывает функцию API Win32 FindWindow). Так, просто сделать это:

windowmgr.find_window(None, 'My Window Name') 

Но даже если это не так, вы не должны использовать его find_window функцию; оно должно быть довольно очевидно, как назвать win32gui.FindWindow себя:

hwnd = win32gui.FindWindow(None, 'My Window Name') 

И если вы хотите хорошее объяснение FindWindow/EnumWindows/и др. синтаксис, вы пытались посмотреть на них документы? Там что-то не поняли?

Тем:

... имя класса окна, которое я не знаю и не смог найти, так как это просто игра работает в Java

Какая разница делает ли он, что он работает на Java? Вы можете перечислять окна и распечатывать их имена классов, независимо от того, написаны ли они на языках C++, Java, .NET, Python или что-то еще. Или используйте один из инструментов, поставляемых с Visual Studio/VS Express, или любую из бесплатных улучшенных версий, которые вы можете найти по всей сети, например MS Spy++, что позволит вам указать на окно и дать название и имя класса.

Я не хочу перечислять окна, чтобы найти его, поскольку я не уверен, как это сработает.

Просто позвоните windowmgr.find_window_wildcard(wildcard) с регулярным выражением, и оно перечислит окна и сравнит их названия с этим регулярным выражением.

Если вы хотите, чтобы написать свой собственный код, чтобы сделать это, просто написать функцию, как это:

def my_callback(hwnd, cookie): 

Теперь, когда вы это делаете:

win32gui.EnumWindows(my_callback, some_cookie) 

... это будет вызывать my_callback функция однократно за окно, с hwnd, являющимся окном (которое вы можете передать win32gui, например, GetWindowText) и cookie - это то же самое значение some_cookie. (Если вы не знаете все, что прошло, просто пройдите None и ничего не делайте со значением в вашей функции обратного вызова. Но вы можете видеть, как другой отвечающему использовал его, чтобы пройти регулярное выражение через)

В то же время:.

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

Во-первых, вы не можете принести окно на передний план, если оно не существует. Как вы ожидаете, что это сработает?

Что касается работы с перерывами, я предполагаю, что есть много окон, которые соответствуют вашему шаблону, и программа будет просто выбирать один из них произвольно. Возможно, это не тот, который вы хотите. (Это может быть даже скрытое окно или что-то в этом роде, поэтому вы ничего не увидите.)

Во всех случаях вам не нужно использовать find_window_wildcard; если вы знаете точное имя, используйте это. Конечно, он все еще может быть не уникальным (независимо от названия игры, вам нечего открывать сообщение электронной почты или окно «Блокнот» с тем же заголовком ... что, кстати, именно поэтому вы хотите сначала попробовать имена классов) но, по крайней мере, это скорее будет уникальным, чем какой-то неопределенный подстановочный знак.

Итак, что, если имя класса не уникально (или, что еще хуже, это один из специальных классов «число», например, # 32770 для общего диалогового окна), и ни одно из них не является именем окна?Вы можете немного сузить ситуацию, посмотрев, скажем, процесс или модуль владения (exe/dll) или родительское окно или что-то еще. Вам нужно будет просмотреть документы win32gui и/или MSDN (см. Выше) для вероятных действий, которые вы можете попробовать, и поиграть через пробную версию и ошибку (помните также инструмент Spy), пока не найдете способ однозначного определения окна. Тогда код, который вверх.

+0

Большое спасибо за это. Насколько это может показаться очевидным, они не для меня. Задача решена. – user2171931

+1

@ user2171931: Многие из этих вещей далеки от очевидности. Документы MSDN хороши и полны, как только вы знаете, что ищете, но вы должны знать, что искать, и очень мало там, чтобы указать вам в правильном направлении. – abarnert

4

Я бы сильно предлагаю вам ознакомиться с страницами для Swapy и для pywinauto. Они могут помочь вам сделать некоторые удивительные вещи, когда дело доходит до UI Automation.

+0

Спасибо, я посмотрю на эти – user2171931

Смежные вопросы