Python,为什么返回的win32api不。ShellExecute handle work for win32gui.GetWindowRect



好的,下面的代码

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

最新更新