Pywinauto выдает ошибку MemoryError в Windows 11, но не в Windows 10

У меня есть этот код, который правильно работает в 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 похожие вопросы, но нашел только один, а ответа на проблему не было.

Это очень интересно. Я вижу это впервые. Пожалуйста, попробуйте app = Application(backend = "uia").connect(title_re=appname, timeout=5) вместо find_window и последующей строки. И какую версию Python вы используете?

Vasily Ryabov 18.04.2024 09:18

Здравствуйте и спасибо за вашу помощь. Я попробовал, и, кажется, это работает, но мне пришлось импортировать приложение, и мне пришлось изменить send_keystrokes на type_keys, иначе я получал ошибку: Error : AttributeError: Neither GUI element (wrapper) nor wrapper method 'send_keystrokes' were found (typo?) Я не знаю, следует ли изменить все экземпляры от send_keystrokes до type_keys, чтобы решить проблему (я управляю многими из этих окон таким образом). Но я не понимаю, почему возникает первая проблема, поскольку на двух других компьютерах с Windows 10 она отлично работает.

itegumo 18.04.2024 10:25

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

itegumo 18.04.2024 11:04

Версия Python: 3.10.7

itegumo 18.04.2024 11:43

Похоже, какая-то проблема в одном из приложений на всем рабочем столе. Фактическая длина текста кажется больше, чем она была возвращена предыдущим обработчиком, который сообщает длину pywinauto. Если бы я мог воспроизвести это на своей стороне, я бы сказал это с большей уверенностью. Также в Руководстве по удаленному выполнению есть и другие трюки, надеюсь, они будут полезны.

Vasily Ryabov 18.04.2024 16:57

Есть ли способ идентифицировать приложение снаружи/вручную? Это новая чистая установка Windows 11 Pro. Хотя я установил драйверы и некоторые приложения, необходимые ноутбуку (штуки MSI). Спасибо, но я имел в виду виртуальные рабочие столы Windows, а не удаленные. Запуск кода на виртуальном рабочем столе не приводит к обнаружению окна на другом виртуальном рабочем столе, как это происходит на других моих компьютерах.

itegumo 18.04.2024 17:15

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

Vasily Ryabov 18.04.2024 17:45

Я попытался запустить код самостоятельно, вообще без окон, но все равно получаю сообщение об ошибке (вместо того, чтобы не найти конкретное окно). Кажется, это связано с серверной частью Win32 и ctypes. На самом деле я использую pyvda, чтобы иметь кнопки для переключения между рабочими столами одним щелчком мыши! Единственное, что я мог сделать, это с его помощью специально переключиться на нужный рабочий стол перед запуском предложенного вами решения. Но это медленно и болезненно, когда я делаю это без переключателя и мгновенно на других моих компьютерах :( Поскольку это связано с ctypes, я попытался установить другую версию Visual C++, но безрезультатно...

itegumo 18.04.2024 18:10

Я только что определил виновника, большое спасибо за ваши идеи! Это было приложение SteelSeriesGG.exe для клавиатуры (раздутое ****...), даже в трее оно как-то возилось.

itegumo 18.04.2024 18:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
9
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я только что определил виновника, огромное спасибо за наводки Василий Рябов! Это было приложение SteelSeriesGG.exe для клавиатуры (раздутое ****...), даже в трее оно как-то возилось.

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

Vasily Ryabov 18.04.2024 18:28

Это очень смешно! Я никогда не думал, что pywinauto будет работать как антивирус. :D

Vasily Ryabov 18.04.2024 18:31

На самом деле, ха-ха-ха, дело в том, что оно появилось в разделе драйверов на странице производителя и научит меня оставлять ненужное ПО.

itegumo 18.04.2024 21:29

Другие вопросы по теме