python - SetWindowsHookEx giver fejl 126: Modul ikke fundet, når

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har brug for en global systemkrog, der vil opfange GDI og få al tekst på skærmen fra applikationen.
Jeg gør dette ved at følge instruktionerne her:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644960(v=vs.85).aspx#installing\_releasing[4]


Kode hidtil:


import ctypes
import atexit
import time
import sys
from ctypes import wintypes, CFUNCTYPE, POINTER, c\_int, c\_uint, c\_void\_p, windll, pointer, byref, WinError
import win32con
WH\_GETMESSAGE = 3
WH\_CALLWNDPROC = 4
cmp\_func = CFUNCTYPE(c\_int, c\_int, wintypes.HINSTANCE, POINTER(c\_void\_p))
gdi\_dll = getattr(ctypes.cdll, 'Gdi32')
SetWindowsHookExA = ctypes.windll.user32.SetWindowsHookExA
SetWindowsHookExA.restype = wintypes.HHOOK
SetWindowsHookExA.argtypes = [c\_int, cmp\_func, wintypes.HINSTANCE, wintypes.DWORD]
UnhookWindowsHookEx = ctypes.windll.user32.UnhookWindowsHookEx
def \_callback\_pointer(handler):
    """Create and return C-pointer"""
    print('handler=',cmp\_func(handler))
    return cmp\_func(handler)

def callback(*args, **kwargs):
    print(args, kwargs)
    res = windll.user32.CallNextHookEx(*args, **kwargs)
    print(res)
    return res

hinstDLL = ctypes.windll.LoadLibrary('Gdi32').\_handle
print('hinstDLL=', hinstDLL)
ctypes.windll.kernel32.GetProcAddress.restype = c\_int
ctypes.windll.kernel32.GetProcAddress.argtypes = [c\_int, ctypes.c\_char\_p]
hkprcSysMsg = ctypes.windll.kernel32.GetProcAddress(hinstDLL, "TextOutA".encode(encoding='ascii'))
if not hkprcSysMsg:
    error = ctypes.windll.kernel32.GetLastError()
    print(WinError(error))
print('hkprcSysMsg=', hkprcSysMsg)
hook = ctypes.windll.user32.SetWindowsHookExA(
    WH\_CALLWNDPROC,
    \_callback\_pointer(callback),
    hkprcSysMsg,
    # hinstDLL,
    0
)
print('hook=',hook)
error = ctypes.windll.kernel32.GetLastError()
print(WinError(error))
if not hook:
    sys.exit()
while True:
    \_process\_win\_msgs() #not included in this question
    time.sleep(0.02)
atexit.register(UnhookWindowsHookEx, hook)


Dette får mig konsekvent



  Fejl 126: Modul ikke fundet.



Men hvis jeg erstatter hkprcSysMsg med hinstDLL, etablerer krogen og virker til at virke, selv om alt det gør det nedbryder alle 32-bit programmer, jeg rører, mens den kører, hvilket er slags forventet, men ikke den adfærd jeg har brug for.
Så hvorfor laver jeg mig til at opfange hele biblioteket, men ikke den særlige procedure?
Hvad skal jeg gøre for at få det rigtigt og læse hele tekstsystemets hele, før det vises på skærmen?

Bedste reference