好的,下面的代码
import win32api
import win32gui
hwnd = win32api.ShellExecute(None, "open", "notepad.exe", "test.txt", None, 6)
rect = win32gui.GetWindowRect(hwnd)
我成功打开Notepad,并收到一个返回值>32,表示执行成功。文档:http://timgolden.me.uk/pywin32-docs/win32api__ShellExecute_meth.html返回值被指定为一个实例句柄,所以我希望能够使用这个句柄作为GetWindowRect调用的参数。文档:http://timgolden.me.uk/pywin32-docs/win32gui__GetWindowRect_meth.html
在我的调试器中,我可以看到hwnd等于一个{long}42,我的GetWindowRect调用返回一个错误1400,无效的窗口句柄。
那么为什么句柄是错误的,我怎样才能得到一个可用的句柄?
根据Microsoft的文档,返回值是HINSTANCE类型,但它不是一个真正的实例,只能用于比较各种错误代码。历史上,在16位窗口中,实例句柄用于标识特定的可执行文件或DLL实例,但即使在那时,它也与窗口句柄不同。
类型:实例句柄
如果函数成功,返回一个更大的值比32。如果函数失败,它返回一个错误值失败的原因。返回值被强制转换为HINSTANCE用于向后兼容16位Windows应用程序。然而,它不是一个真正的HINSTANCE。它只能被强制转换为int型和与32或下面的错误代码比较。
据我所知,获得可用窗口句柄的最佳方法是遍历系统中的顶层窗口,直到找到具有预期类和标题的窗口。
下面是我几年前写的一段代码摘录,用于查找具有匹配标题和类的窗口:
from win32gui import EnumWindows, GetClassName
from win32ui import CreateWindowFromHandle
def toplevelWindows(s, klass):
res = []
def callback(hwnd, arg):
name = GetClassName(hwnd)
w = CreateWindowFromHandle(hwnd)
title = w.GetWindowText()
if s in title or name==klass:
res.append(w)
EnumWindows(callback, 0)
return res