win32gui.SetForegroundWindow (handle) не работает в цикле - PullRequest
0 голосов
/ 02 июля 2019

Я новичок в python и в целом в кодировании, но я создаю программное обеспечение "музыкальный автомат", которое будет принимать данные от пользователя и открывать эту песню в spotify.У меня это работает довольно хорошо, но хотелось бы, чтобы он работал без монитора или мыши, только клавиатура (как обычный музыкальный автомат).

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

def bring_to_front():
    global handle
    handle = win32gui.FindWindowEx(0,0,None,r'C:\WINDOWS\py.exe')
    print(handle)
    win32gui.SetForegroundWindow(handle)

Я использую эту функцию в своей программе следующим образом:

def program():
    global driver
    driver = webdriver.Chrome()

    site_login()

    while True:
        global handle
        global s
        global new_track
        bring_to_front()
        song_request()
        close_extra_tabs()
        if s == '*':
            restart()
        if s == '':
            print('Song stopped')
        else:
            for x in song_list:
                if x[0] == s:
                    new_track = x[2]
                    play_song()
                    print('Playing your song.')
                    break
                elif x == 'not_found':
                    print('Song not found')
                    error_audio()
                    break
                else:
                    continue

Функция site_login () открывает Chromeи входит в систему, чтобы спрайтировать, таким образом помещая это окно сверху.Первая итерация методаrate_to_front () в цикле while успешно помещает окно ввода на передний план и позволяет мне ввести код песни.Однако, как только я сделал это в первый раз, и Chrome снова был выведен на передний план (чтобы открыть песню), я получаю сообщение об ошибке на второй итерации метода take_to_front ().Проблема конкретно с win32gui.SetForegroundWindow (дескриптор).Я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "C:\Users\user1\Documents\Spotify Jukebox\Spotify Jukebox3.py", line 125, in <module>
    program()
  File "C:\Users\user1\Documents\Spotify Jukebox\Spotify Jukebox3.py", line 102, in program
    bring_to_front()
  File "C:\Users\user1\Documents\Spotify Jukebox\Spotify Jukebox3.py", line 62, in bring_to_front
    win32gui.SetForegroundWindow(handle)
pywintypes.error: (0, 'SetForegroundWindow', 'No error message is available')

Я не могу понять, почему это работает в первый раз, но после этого работать не будет.Я нашел эту статью, которая, кажется, ссылается на ту же проблему.Решение говорит, что оно работает, если вы сначала отправите alt-ключ, но я не мог понять, как это сделать, на его примере.Как я уже сказал, я новичок во всем этом.Любая помощь будет оценена.Спасибо!

1 Ответ

0 голосов
/ 09 июля 2019

Я нашел одно из самых странных решений для этого - перед каждым вызовом setWindowForeground виртуальным нажатием клавиши alt.

Я использовал pyautogui для этого.Вставьте следующую строку между двумя последующими вызовами в одном коде

pyautogui.press("alt")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...