SetForegroundWindow() не запускается, когда окно RDP на сервер свернуто или заблокировано

Я работаю над проектом автоматизации, который требует, чтобы я искал процесс акробата, а затем выводил его на передний план. Я использую Windows Server 2012 R2 Standard и Python. Я ищу этот конкретный PDF-файл в списке процессов, а затем пытаюсь вывести это окно на передний план.

Мой код работает нормально, когда сервер открыт и активен. Как только он сворачивается или блокируется, он не работает. В частности, строка SetForegroundWindow() не работает и выдает ошибку "(0, 'SetForegroundWindow', 'Сообщение об ошибке недоступно')".

Затем я просмотрел множество примеров, перечисленных здесь, и кто-то предложил использовать вкладку «Alt» перед этой строкой. Пробовал, не получилось. Затем я использовал ShowWindow() в соответствии с другим пользователем, но снова появляется та же ошибка. Теперь я полностью застрял.

Я уже просмотрел много потоков, связанных с проблемой, например: 1. SetForegroundWindow не работает со свернутым процессом 2. Переместить окно вперед при сворачивании 3 . Переместить окно вперед при сворачивании

Я пробовал, MainWindowHandle может исправить ошибку, но я не могу реализовать ее в python.

Кроме того, я установил pywinauto и использовал функцию findwindows и SetForegroundWindow pywinauto. Он хорошо работает, когда сервер активен, но как только мы сворачиваем или блокируем сервер, он не работает и выдает ту же ошибку "(0, 'SetForegroundWindow', 'Сообщение об ошибке недоступно')".

Теперь у меня совсем нет вариантов. Есть идеи/предложения?

Вот фрагмент:

import win32gui,win32con
import win32com.client
import time

time.sleep(3)
def windowEnumerationHandler(hwnd, top_windows):
    if win32gui.IsWindowVisible(hwnd) and win32gui.GetWindowText(hwnd)!='':
        top_windows.append((hwnd, win32gui.GetWindowText(hwnd)))

results = []
top_windows = []
file_name_of_pdf = "ARW_AR_2016.pdf"
win32gui.EnumWindows(windowEnumerationHandler, top_windows)

for i in top_windows:

 if i[1].find(file_name_of_pdf[:len(file_name_of_pdf)-4])>-1:

    print(i)
    shell = win32com.client.Dispatch("WScript.Shell")
    win32gui.ShowWindow(i[0],9)
    try:
        shell.SendKeys('%')
        win32gui.ShowWindow(i[0], win32con.SW_RESTORE)                                 
        win32gui.SetForegroundWindow(i[0])            
    except Exception as e:
        print(1,e)
        try:
            shell.SendKeys('%')                
            win32gui.SetForegroundWindow(i[0])
        except Exception as r:
            print(2,r)
            pass 

person Prabal    schedule 08.03.2019    source источник
comment
Что означает «Как только он будет свернут или заблокирован»? Что блокируется? Рабочий стол? Что минимизируется? Ваше приложение или Acrobat?   -  person Ben    schedule 08.03.2019
comment
Поэтому я работаю на удаленном рабочем столе и локальном рабочем столе. Если я запускаю код и сворачиваю сервер, он не работает. В состоянии получить его?   -  person Prabal    schedule 08.03.2019
comment
Сервер — это слово, которое может означать много вещей. Когда вы говорите свернуть сервер, вы имеете в виду свернуть главное окно RDP-клиента? Что именно вы минимизируете?   -  person Ben    schedule 08.03.2019
comment
Да, главное окно RDP-клиента свернуто.   -  person Prabal    schedule 08.03.2019
comment
И работает ли этот код Python на локальном компьютере или в сеансе RDP?   -  person Ben    schedule 08.03.2019
comment
Возможный дубликат SetForegroundWindow в подключении к удаленному рабочему столу   -  person Ben    schedule 08.03.2019
comment
Я дал ссылку на повторяющийся вопрос с правильным ответом. Если этот ответ поможет вам, пожалуйста, проголосуйте за него.   -  person Ben    schedule 08.03.2019
comment
@Ben: этот код выполняется в сеансе RDP. Я прошел дублирующую ссылку, которую вы прикрепили. В нем говорится, что контекст автоматизации графического интерфейса не имеет смысла, когда окно RDP свернуто. Следовательно, кажется, что здесь нет решения. Мы должны следовать принципу «хозяин-раб». Не так ли?   -  person Prabal    schedule 11.03.2019
comment
Решение: не сворачивайте окно RDP. Вы можете сделать его маленьким и переместить за пределы экрана, но не сворачивать.   -  person Ben    schedule 11.03.2019


Ответы (1)


В Руководстве по удаленному выполнению должно быть объяснено все, что вы можете сделать в этой ситуации.

person Vasily Ryabov    schedule 08.03.2019