在 Python win32gui 中聚焦 child window

Focus child window in Python win32gui

我正在使用 Python 向其他程序发送键盘命令。我有一个可行的解决方案,但我正在寻求改进它。

其他程序是 Genesys CCPulse 报告,我同时有四个不同的实例 运行。每个实例都有自己的主window,然后内部有一些childwindows(最多30个)。

感谢这个 post Python Window Activation 我已经能够在主 windows 之间切换并在前台获得我需要的那个。我目前正在使用键盘命令发送菜单快捷方式以将焦点更改为 child windows 并保存它们。

我想避免菜单导航,只激活每个 child window,然后发送命令保存它们。另一个 post EnumChildWindows not working in pywin32 为我提供了 child windows.

的句柄列表

理想情况下,如果可能的话,我想继续使用 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()

刚找到这个问题的答案

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

BringWindowToTop 命令将依次激活每个子 window。然后我可以继续向每个 window.

发出我想要的任何命令