2017-09-03 50 views
0

我注意到,如果使用窗口焦点检测,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这两者都做同样的事情,只是想知道我是否错过了什么?

+0

这个问题真的是你的问题陈述。 Windows不保留*“主窗口”*的概念。任何Windows程序都可以有零个或多个顶级窗口。除非你提出一个你真正需要的简洁说明,否则你不会解决这个问题。 – IInspectable

+0

没有开发的窗口我不知道什么是可能的,但不是,但我会想到对话框和菜单下拉菜单将主窗口。通常当我看到来自同一个程序的多个窗口时,每个窗口都作为一个单独的进程运行,这很好。我只是需要所选进程的主父窗口(如果存在)。 – Peter

+0

我其实从它的评论中发现它哈哈,寻找父母似乎已经工作 – Peter

回答

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值,并返回一个恒定的分辨率。