在检查聚焦窗口的大小时是否可以忽略对话框?

时间:2017-09-03 16:06:11

标签: python windows focus

我注意到如果使用Windows焦点检测,rect值将根据您所在程序的哪个部分而改变。我希望仅在可能的情况下使用主窗口的大小。

我通过检查窗口标题设法解决了其中一些问题。如果标题为空,则它是一个下拉菜单,所以请忽略。如果它标题为"打开","另存为"等,那么它显然是一个对话框并忽略。但是,消息"您是否要在不保存的情况下退出?"似乎只有程序本身的标题,所以通过检查。

我刚刚测试了这些框的高度,看看是否有一个值要忽略的常数值,但每个程序似乎都有不同的高度。我可能会忽略某些分辨率下的任何内容,但我不愿意,因为它实际上没有解决问题,并且可能有一些罕见的情况需要使用该特定分辨率。

这是我目前使用pywin32进行检测的代码位。我也有ctypes替代品,但它基本上是相同的。

import win32gui
import win32process
import psutil

hwnd = win32gui.GetForegroundWindow()

print 'pid:', win32process.GetWindowThreadProcessId(hwnd)[1]
print 'rect:', win32gui.GetWindowRect(hwnd)
print 'name:', win32gui.GetWindowText(hwnd)
print 'exe:', psutil.Process(win32process.GetWindowThreadProcessId(hwnd)[1]).name()

基本上我总是想要主窗口的大小,无论在其上加载哪个其他窗口。我只找到了GetWindowRectGetClientRect,它们都做同样的事情,只是想知道我是否遗漏了什么?

1 个答案:

答案 0 :(得分:0)

通过意识到它基本上是我需要的最后一个父窗口来管理以获得解决方案:

def _get_parent(self):
    while True:
        try:
            parent = win32gui.GetParent(hwnd)
        except UnboundLocalError:
            hwnd = win32gui.GetForegroundWindow()
        else:
            if parent:
                hwnd = parent
            else:
                break
    return hwnd

基本上它只是继续检查当前窗口是否有父项,直到没有更多父项。不是超级高效,但做的工作。我只在paint > save as > are you sure you want to replace?上测试了它,但是它获得了主窗口的正确hwnd值并返回了一个恒定的分辨率。