已创建窗口的Get hwnd处理程序

2024-05-29 02:16:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个窗口,然后获取所创建窗口的hwnd。在

目前,我调用subprocess.run("run.exe")来创建窗口,然后继续调用wg.GetForegroundWindow()来获取前景窗口的hwnd,这应该是新创建的窗口。然而,这并不能很好地工作,因为程序必须在被检测为前景之前完成打开,并且用户可以同时改变焦点。在

有没有更一致的方法来获得hwnd?在

编辑: 以下是我在以下评论的帮助下所做的:

def create_window():
    user32 = ctypes.windll.user32
    ole32 = ctypes.windll.ole32

    EVENT_OBJECT_CREATE = 0x8000
    def callback(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime):
        if is_real_window(hwnd):
            print(get_text(hwnd), "HOOKED")
            user32.UnhookWinEvent(hWinEventHook)
            return hwnd

    WinEventProcType = ctypes.WINFUNCTYPE(
        None, 
        ctypes.wintypes.HANDLE,
        ctypes.wintypes.DWORD,
        ctypes.wintypes.HWND,
        ctypes.wintypes.LONG,
        ctypes.wintypes.LONG,
        ctypes.wintypes.DWORD,
        ctypes.wintypes.DWORD
    )

    WinEventProc = WinEventProcType(callback)

    user32.SetWinEventHook.restype = ctypes.wintypes.HANDLE
    hook = user32.SetWinEventHook(
        EVENT_OBJECT_CREATE,
        EVENT_OBJECT_CREATE,
        0,
        WinEventProc,
        0,
        0,
        0
    )
    if hook == 0:
        print('SetWinEventHook failed')
        sys.exit(1)

    msg = ctypes.wintypes.MSG()

    x = subprocess.Popen("C:\\cygwin64\\bin\\mintty.exe")

    m = user32.GetMessageW(ctypes.byref(msg), 0, 0, 0)

然而,这面临两个问题。第一,虽然我可以在回调函数中访问hwnd,但似乎没有办法让create_window返回这个值。其次,GetMessage窗口继续运行,即使在调用UnhookWinEvent之后也是如此。在

我能做些什么来修理这些?在


Tags: runeventobjectdefcreatewindowctypesexe

热门问题