How to use winapi SetWinEventHook in python?

前端 未结 1 501
北海茫月
北海茫月 2021-02-08 23:17

I want to get the handle of every new Dialog which pops up from a specific application.
I understand I should set a hook with SetWinEventHook which is in user32.dll

相关标签:
1条回答
  • 2021-02-09 00:22

    Here's a very simple example that prints to the console the window text for each dialog that is opened:

    import sys
    import time
    import ctypes
    import ctypes.wintypes
    
    EVENT_SYSTEM_DIALOGSTART = 0x0010
    WINEVENT_OUTOFCONTEXT = 0x0000
    
    user32 = ctypes.windll.user32
    ole32 = ctypes.windll.ole32
    
    ole32.CoInitialize(0)
    
    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
    )
    
    def callback(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime):
        length = user32.GetWindowTextLengthA(hwnd)
        buff = ctypes.create_string_buffer(length + 1)
        user32.GetWindowTextA(hwnd, buff, length + 1)
        print buff.value
    
    WinEventProc = WinEventProcType(callback)
    
    user32.SetWinEventHook.restype = ctypes.wintypes.HANDLE
    hook = user32.SetWinEventHook(
        EVENT_SYSTEM_DIALOGSTART,
        EVENT_SYSTEM_DIALOGSTART,
        0,
        WinEventProc,
        0,
        0,
        WINEVENT_OUTOFCONTEXT
    )
    if hook == 0:
        print 'SetWinEventHook failed'
        sys.exit(1)
    
    msg = ctypes.wintypes.MSG()
    while user32.GetMessageW(ctypes.byref(msg), 0, 0, 0) != 0:
        user32.TranslateMessageW(msg)
        user32.DispatchMessageW(msg)
    
    user32.UnhookWinEvent(hook)
    ole32.CoUninitialize()
    
    0 讨论(0)
提交回复
热议问题