У меня есть этот код, который правильно работает в Windows 10, который я использую для отправки текста и ввода ключей в определенное окно с помощью pywinauto, но как только я попытался использовать его в другой системе с помощью Win 11, он не работает. Вот код:
import pywinauto
import time
boolBisCheckbox = False
def parar(eachFfox):
global boolBisCheckbox
if boolBisCheckbox == False:
appname = r"\[FIREFOX " + eachFfox + r"\]"
else:
appname = r"\[FIREFOX " + eachFfox + r"2\]"
handle = pywinauto.findwindows.find_window(title_re=appname)
app = pywinauto.application.Application(backend = "win32").connect(handle=handle)
Wizard = app[appname]
Wizard.send_keystrokes("parar")
time.sleep(0.5)
Wizard.send_keystrokes("{ENTER}")
time.sleep(6)
Wizard.send_keystrokes("{ENTER}")
time.sleep(10)
Wizard.send_keystrokes("{ENTER}")
input()
parar("A")
И вот ошибка:
Traceback (most recent call last):
File "C:\pypy\testParar.py", line 23, in <module>
parar("A")
File "C:\pypy\testParar.py", line 12, in parar
handle = pywinauto.findwindows.find_window(title_re=appname)
File "C:\Python\lib\site-packages\pywinauto\findwindows.py", line 113, in find_window
element = find_element(**kwargs)
File "C:\Python\lib\site-packages\pywinauto\findwindows.py", line 84, in find_element
elements = find_elements(**kwargs)
File "C:\Python\lib\site-packages\pywinauto\findwindows.py", line 283, in find_elements
elements = [elem for elem in elements if _title_match(elem)]
File "C:\Python\lib\site-packages\pywinauto\findwindows.py", line 283, in <listcomp>
elements = [elem for elem in elements if _title_match(elem)]
File "C:\Python\lib\site-packages\pywinauto\findwindows.py", line 279, in _title_match
t = w.rich_text
File "C:\Python\lib\site-packages\pywinauto\win32_element_info.py", line 83, in rich_text
return handleprops.text(self.handle)
File "C:\Python\lib\site-packages\pywinauto\handleprops.py", line 92, in text
buffer_ = create_unicode_buffer(length)
File "C:\Python\lib\ctypes\_init_.py", line 297, in create_unicode_buffer
buf = buftype()
MemoryError
Я взял тот же код, который использовался на другом компьютере под управлением Win 10, где он работал правильно, и использовал его в Win 11. Обе системы имеют 32 ГБ оперативной памяти. Я пытался найти в Google похожие вопросы, но нашел только один, а ответа на проблему не было.
Здравствуйте и спасибо за вашу помощь. Я попробовал, и, кажется, это работает, но мне пришлось импортировать приложение, и мне пришлось изменить send_keystrokes
на type_keys
, иначе я получал ошибку: Error : AttributeError: Neither GUI element (wrapper) nor wrapper method 'send_keystrokes' were found (typo?)
Я не знаю, следует ли изменить все экземпляры от send_keystrokes до type_keys, чтобы решить проблему (я управляю многими из этих окон таким образом). Но я не понимаю, почему возникает первая проблема, поскольку на двух других компьютерах с Windows 10 она отлично работает.
Я не могу изменить его на этот метод, поскольку он не работает на неактивных рабочих столах (я управлял несколькими окнами на нескольких рабочих столах).
Версия Python: 3.10.7
Похоже, какая-то проблема в одном из приложений на всем рабочем столе. Фактическая длина текста кажется больше, чем она была возвращена предыдущим обработчиком, который сообщает длину pywinauto
. Если бы я мог воспроизвести это на своей стороне, я бы сказал это с большей уверенностью. Также в Руководстве по удаленному выполнению есть и другие трюки, надеюсь, они будут полезны.
Есть ли способ идентифицировать приложение снаружи/вручную? Это новая чистая установка Windows 11 Pro. Хотя я установил драйверы и некоторые приложения, необходимые ноутбуку (штуки MSI). Спасибо, но я имел в виду виртуальные рабочие столы Windows, а не удаленные. Запуск кода на виртуальном рабочем столе не приводит к обнаружению окна на другом виртуальном рабочем столе, как это происходит на других моих компьютерах.
Я могу предложить только максимально закрыть все окна на этом виртуальном рабочем столе. Возможно, это сам Firefox или какое-то другое приложение. Что касается доступа к другим виртуальным рабочим столам, я недавно услышал о пакете pyvda
, но на данный момент он не интегрирован с pywinauto
. Я думаю, pywinauto
нужны некоторые изменения, чтобы использовать виртуальный рабочий стол не по умолчанию.
Я попытался запустить код самостоятельно, вообще без окон, но все равно получаю сообщение об ошибке (вместо того, чтобы не найти конкретное окно). Кажется, это связано с серверной частью Win32 и ctypes. На самом деле я использую pyvda, чтобы иметь кнопки для переключения между рабочими столами одним щелчком мыши! Единственное, что я мог сделать, это с его помощью специально переключиться на нужный рабочий стол перед запуском предложенного вами решения. Но это медленно и болезненно, когда я делаю это без переключателя и мгновенно на других моих компьютерах :( Поскольку это связано с ctypes, я попытался установить другую версию Visual C++, но безрезультатно...
Я только что определил виновника, большое спасибо за ваши идеи! Это было приложение SteelSeriesGG.exe для клавиатуры (раздутое ****...), даже в трее оно как-то возилось.
Я только что определил виновника, огромное спасибо за наводки Василий Рябов! Это было приложение SteelSeriesGG.exe для клавиатуры (раздутое ****...), даже в трее оно как-то возилось.
Большой! Вы можете пометить свой ответ как принятый (слева есть серая галочка, которая вам подойдет). Это сэкономит время другим, чтобы они знали, что проблема уже решена.
Это очень смешно! Я никогда не думал, что pywinauto будет работать как антивирус. :D
На самом деле, ха-ха-ха, дело в том, что оно появилось в разделе драйверов на странице производителя и научит меня оставлять ненужное ПО.
Это очень интересно. Я вижу это впервые. Пожалуйста, попробуйте
app = Application(backend = "uia").connect(title_re=appname, timeout=5)
вместоfind_window
и последующей строки. И какую версию Python вы используете?