代码之家  ›  专栏  ›  技术社区  ›  Peter

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

  •  0
  • Peter  · 技术社区  · 8 年前

    我注意到,如果使用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()
    

    GetWindowRect GetClientRect 哪两个都做相同的事情,只是想知道我是否错过了什么?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Peter    8 年前

    意识到这基本上是我需要的最后一个父窗口,从而设法找到了解决方案:

    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