Python win32gui中的焦点子窗口

Posted

技术标签:

【中文标题】Python win32gui中的焦点子窗口【英文标题】:Focus child window in Python win32gui 【发布时间】:2016-10-26 14:25:18 【问题描述】:

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

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

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

我想避免菜单导航,只激活每个子窗口,然后发送命令来保存它们。另一个帖子EnumChildWindows not working in 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 命令将依次激活每个子窗口。然后我可以继续向每个窗口发出我想要的任何命令。

【讨论】:

以上是关于Python win32gui中的焦点子窗口的主要内容,如果未能解决你的问题,请参考以下文章

python中获取子窗口的句柄

Python win32gui 获取窗口中虚拟光标的当前位置

Win32API:如何向父窗口请求嵌入式 Windows 事件通知

Selenium+python怎么让鼠标焦点切换到当前窗口里面的子窗口子窗口

PyQt5从子窗口关闭父窗口和子窗口

Python中设置指定窗口为前台活动窗口(最顶层窗口)win32gui