Фокус дочернего окна в Python win32gui

Я использую Python для отправки команд клавиатуры другим программам. У меня есть рабочее решение, но я хочу его улучшить.

Другие программы - это отчеты Genesys CCPulse, и у меня одновременно работают четыре разных экземпляра. Каждый экземпляр имеет свое собственное главное окно, а затем несколько дочерних окон внутри (до 30).

Благодаря этому сообщению Python Window Activation я смог переключиться между основными окнами и получить то, что мне нужно, на переднем плане. В настоящее время я использую команды клавиатуры для отправки ярлыков меню, чтобы изменить фокус на дочерние окна и сохранить их.

Я хотел бы избежать навигации по меню и просто активировать каждое дочернее окно, а затем отправить команды для их сохранения. В другом посте EnumChildWindows, не работающем в pywin32, я получил список дескрипторов для дочерних окон.

В идеале я хотел бы продолжить использовать win32gui, если это возможно, так как остальная часть кода работает.

Текущий код

import win32gui
import re

class WindowMgr:
    #set the wildcard string you will search for
    def find_window_wildcard(self, wildcard):
        self._handle = None
        win32gui.EnumWindows(self.window_enum_callback, wildcard)

    #enumurate through all the windows until you find the one you need
    def window_enum_callback(self, hwnd, wildcard):
        if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) != None:
            self._handle = hwnd ##pass back the id of the window

    #as a separate function, set the window to the foreground    
    def set_foreground(self):
        win32gui.SetForegroundWindow(self._handle)

    #extra function to get all child window handles
    def get_child_handles(self):
        win32gui.EnumChildWindows(self._handle, add_to_list, None)

    #final function to send the commands in
    def flash_window(self):
        for c_hwnd in child_list:
            print((self._handle),(c_hwnd),(win32gui.GetWindowText(c_hwnd))) #prove correct child window found
            #send command1#
            #send command2#
            #send command3#

#seprate fundction to collect the list of child handles
def add_to_list(hwnd, param):
    if win32gui.GetWindowText(hwnd)[:3] == "IWD":
        child_list.append(hwnd)

child_list=[]
w = WindowMgr()

w.find_window_wildcard(".*Sales*")
w.set_foreground()
w.get_child_handles()
w.flash_window()

1 ответ

Решение

Просто нашел ответ на этот

    def flash_window(self):
    for c_hwnd in child_list:
        win32gui.BringWindowToTop(c_hwnd)

Это BringWindowToTop Команда, которая активирует каждое дочернее окно по очереди. Затем я могу выполнить любые команды для каждого окна.

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