程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Python,为什么返回的win32api.ShellExecute句柄对win32gui.GetWindowRect不起作用

发布于2020-01-17 19:41     阅读(2004)     评论(0)     点赞(30)     收藏(0)


OK,所以在下面的代码中

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

我成功打开记事本,并收到一个大于32的返回值,以指示执行成功。在docs中: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实例,但即使那样,它也与窗口句柄不同。

返回值

类型:HINSTANCE

如果函数成功,则返回大于32的值。如果函数失败,则返回指示失败原因的错误值。返回值强制转换为HINSTANCE,以便与16位Windows应用程序向后兼容。但是,这不是真正的阻碍。只能将其强制转换为int并与下面的32或以下错误代码进行比较。

据我所知,获得可用的窗口句柄的最佳方法是遍历系统中的顶级窗口,直到找到具有预期类和标题的窗口。

这是基于我几年前写过的东西的代码摘录,它查找具有匹配标题和类的Windows:

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


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/228615/a239e540b1954de6d7c5/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)