检查焦点 window 大小时是否可以忽略对话框?
Is it possible to ignore dialogue boxes when checking size of focused window?
我注意到如果使用 windows 焦点检测,rect
值会根据您所在程序的哪个部分而改变。我想要主要 window 的大小仅在可能的情况下。
我已经通过检查 window 标题设法解决了其中的一些问题。如果标题为空,则为下拉菜单,请忽略。如果它的标题是 "Open"、"Save As" 等,那么它显然是一个对话框,请忽略。但是,消息 "Do you want to quit without saving?" 似乎只有程序本身的标题,因此未通过检查。
我刚刚测试了那些盒子的高度,看看是否有一个常数值可以忽略,但每个程序似乎都有不同的高度。我可能会忽略特定分辨率下的任何内容,但我不想这样做,因为它实际上并没有解决问题,并且在极少数情况下可能需要使用该特定分辨率。
这是我目前使用 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()
基本上我一直想要主 window 的大小,无论哪个其他 windows 加载在它上面。我只发现 GetWindowRect
和 GetClientRect
两者做同样的事情,只是想知道我是否遗漏了什么?
通过意识到它基本上是我需要的最后一个父 window 来设法找到解决方案:
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
基本上它只是不断检查当前 window 是否有父对象,直到没有父对象为止。不是超级高效,但可以完成工作。我只在 paint > save as > are you sure you want to replace?
上真正测试过它,但它得到了正确的 hwnd
主值 window 和 returns 恒定分辨率。
我注意到如果使用 windows 焦点检测,rect
值会根据您所在程序的哪个部分而改变。我想要主要 window 的大小仅在可能的情况下。
我已经通过检查 window 标题设法解决了其中的一些问题。如果标题为空,则为下拉菜单,请忽略。如果它的标题是 "Open"、"Save As" 等,那么它显然是一个对话框,请忽略。但是,消息 "Do you want to quit without saving?" 似乎只有程序本身的标题,因此未通过检查。
我刚刚测试了那些盒子的高度,看看是否有一个常数值可以忽略,但每个程序似乎都有不同的高度。我可能会忽略特定分辨率下的任何内容,但我不想这样做,因为它实际上并没有解决问题,并且在极少数情况下可能需要使用该特定分辨率。
这是我目前使用 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()
基本上我一直想要主 window 的大小,无论哪个其他 windows 加载在它上面。我只发现 GetWindowRect
和 GetClientRect
两者做同样的事情,只是想知道我是否遗漏了什么?
通过意识到它基本上是我需要的最后一个父 window 来设法找到解决方案:
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
基本上它只是不断检查当前 window 是否有父对象,直到没有父对象为止。不是超级高效,但可以完成工作。我只在 paint > save as > are you sure you want to replace?
上真正测试过它,但它得到了正确的 hwnd
主值 window 和 returns 恒定分辨率。