【问题标题】:Python, Why doesn't the returned win32api.ShellExecute handle work for win32gui.GetWindowRectPython,为什么返回的 win32api.ShellExecute 句柄对 win32gui.GetWindowRect 不起作用
【发布时间】:2014-03-18 18:02:18
【问题描述】:

好的,所以在下面的代码中

import win32api
import win32gui
hwnd = win32api.ShellExecute(None, "open", "notepad.exe", "test.txt", None, 6)
rect = win32gui.GetWindowRect(hwnd)

我成功打开记事本并收到返回值>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,窗口句柄无效。

那么为什么句柄是错误的,我怎样才能得到一个可用的句柄呢?

【问题讨论】:

  • 即使你取回了一个有效的句柄,实例句柄也不同于窗口句柄。

标签: python winapi


【解决方案1】:

根据Microsoft's documentation,返回值是 HINSTANCE 类型,但它不是一个真实的实例,只能用于与各种错误代码进行比较。历史上,在 16 位窗口中,实例句柄用于标识特定的可执行文件或 DLL 实例,但即便如此,它也与窗口句柄不同。

返回值

类型:HINSTANCE

如果函数成功,则返回一个更大的值 大于 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

【讨论】:

  • 无论如何,您应该声明HINSTANCEHWND 不相关
  • 感谢您的可靠回答。我找到了相关信息,但从未明确说明它们不是相关句柄。我的一部分简直不敢相信没有可以使用的参考,并且需要查找。
  • 另一个非常有用的链接,来自扩展作者的解决方案:link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
相关资源
最近更新 更多