首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GetGUIThreadInfo()与pywin32

GetGUIThreadInfo()与pywin32
EN

Stack Overflow用户
提问于 2020-01-23 18:05:19
回答 1查看 257关注 0票数 2

我正试图跟踪这个答案,我已经到了一个应该调用

代码语言:javascript
运行
复制
GetGUIThreadInfo()

但我在使用的pywin32吞吐中找不到这一点。

到目前为止我所做的是

代码语言:javascript
运行
复制
import win32api
import win32gui
import win32process

test1 = win32gui.FindWindowEx(0, 0, 0, "notepad")
(test1tid, test1pid) = win32process.GetWindowThreadProcessId(test1)
test1hwndFocus = win32process.GetGUIThreadInfo(test1tid)

但是最后一行是完整的,因为我找不到正确的方法来调用函数。

Update1:

我认为我取得了一些进展,但现在我的结构只返回0,当我期望一些.所以,也许我的结构不是写的,我认为这可能是因为我的结构中的类型,但是我如何找到正确的类型呢?

代码语言:javascript
运行
复制
import win32api
import win32gui
import win32process
import ctypes

class RECT(ctypes.Structure):
    _fields_ = [
    ("left", ctypes.c_ulong),
    ("top", ctypes.c_ulong),
    ("right", ctypes.c_ulong),
    ("bottom", ctypes.c_ulong)
    ]


class GUITHREADINFO(ctypes.Structure):
    _fields_ = [
    ("cbSize", ctypes.c_ulong),
    ("flags", ctypes.c_ulong),
    ("hwndActive", ctypes.c_ulong),
    ("hwndFocus", ctypes.c_ulong),
    ("hwndCapture", ctypes.c_ulong),
    ("hwndMenuOwner", ctypes.c_ulong),
    ("hwndMoveSize", ctypes.c_ulong),
    ("hwndCaret", ctypes.c_ulong),
    ("rcCaret", RECT)
    ]

guiThreadInfoStruct = GUITHREADINFO()


ctypes.sizeof(gtitest)

test1 = win32gui.FindWindowEx(0, 0, 0, "notepad")
(test1tid, test1pid) = win32process.GetWindowThreadProcessId(test1)
ctypes.windll.user32.GetGUIThreadInfo(test1tid, guiThreadInfoStruct)
print (guiThreadInfoStruct.hwndFocus)

Update2:

我找到了这里类型

update3:

如果有人想看看我用这个做什么去看看这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-24 15:41:42

显然,[MS.Docs]:GetGUIThreadInfo函数不是由PyWin32包装的,所以必须使用其他方法。其中之一是通过[Python3.Docs]:ctypes Python的外部函数库调用它(涉及编写大量额外代码)。

code00.py

代码语言:javascript
运行
复制
#!/usr/bin/env python

import sys
import win32gui as wgui
import win32process as wproc
import win32con as wcon

import ctypes as ct
from ctypes import wintypes as wt


class GUITHREADINFO(ct.Structure):
    _fields_ = [
        ("cbSize", wt.DWORD),
        ("flags", wt.DWORD),
        ("hwndActive", wt.HWND),
        ("hwndFocus", wt.HWND),
        ("hwndCapture", wt.HWND),
        ("hwndMenuOwner", wt.HWND),
        ("hwndMoveSize", wt.HWND),
        ("hwndCaret", wt.HWND),
        ("rcCaret", wt.RECT),

    ]

    def __str__(self):
        ret = "\n" + self.__repr__()
        start_format = "\n  {0:s}: "
        for field_name, _ in self. _fields_[:-1]:
            field_value = getattr(self, field_name)
            field_format = start_format + ("0x{1:016X}" if field_value else "{1:}")
            ret += field_format.format(field_name, field_value)
        rc_caret = getattr(self, self. _fields_[-1][0])
        ret += (start_format + "({1:d}, {2:d}, {3:d}, {4:d})").format(self. _fields_[-1][0], rc_caret.top, rc_caret.left, rc_caret.right, rc_caret.bottom)
        return ret


def main(*argv):
    window_name = "Untitled - Notepad"
    hwnd = wgui.FindWindowEx(wcon.NULL, 0, wcon.NULL, window_name)
    print("'{0:s}' window handle: 0x{1:016X}".format(window_name, hwnd))
    tid, pid = wproc.GetWindowThreadProcessId(hwnd)
    print("PId: {0:d}, TId: {1:d}".format(pid, tid))

    user32_dll = ct.WinDLL("user32.dll")
    GetGUIThreadInfo = getattr(user32_dll, "GetGUIThreadInfo")
    GetGUIThreadInfo.argtypes = [wt.DWORD, ct.POINTER(GUITHREADINFO)]
    GetGUIThreadInfo.restype = wt.BOOL

    gti = GUITHREADINFO()
    gti.cbSize = ct.sizeof(GUITHREADINFO)
    res = GetGUIThreadInfo(tid, ct.byref(gti))
    print("{0:s} returned: {1:d}".format(GetGUIThreadInfo.__name__, res))
    if res:
        print(gti)


if __name__ == "__main__":
    print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    main(*sys.argv[1:])
    print("\nDone.")

输出

Python3.7.6( e:\Work\Dev\StackOverflow\q059884688>"e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe“/v3.7.6:43364a7ae0,2019年12月19日,00:42:30) MSC v.1916 64位(AMD64) 64位( win32 'Untitled Notepad‘窗口句柄:0x000000000000042B20D8 PId: 37192,TId: 53072 GetGUIThreadInfo返回:1 <__main__.GUITHREADINFO对象在0x0000022649436648> cbSize: 0x00000000000048标志:0 hwndActive: None hwndFocus: None hwndCapture: None hwndMenuOwner: None hwndMoveSize: None hwndCaret: None rcCaret:(0,0,0,0)已完成。

Notes

  • 打印您正在使用的数据,因为它可能与您预期的不同。例如,记事本窗口标题不是代码所期望的“记事本”,在这种情况下,win32gui.FindWindowEx将返回NULL (0)。
  • 我也使用[ActiveState.Docs]:PyWin32文档 (它是旧的和过时的,但在大多数情况下它非常有用)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59884688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档