Python с использованием WinAPI SetWindowsHookExA на windows 10 недействительно - PullRequest
0 голосов
/ 20 февраля 2020

Я экспериментирую с подключением python с использованием SetWindowsHookExA с системой windows 10. Но код ASCII в верхнем регистре всегда фиксируется, и содержимое в структуре KBDLLHOOKSTRUCT точно такое же.

Я просмотрел документацию MSDN, но не смог найти никакой полезной информации

Я использую Python3 .7, ОС - Windows10

import sys
import ctypes
from ctypes import *
from ctypes.wintypes import DWORD, HHOOK, HINSTANCE, MSG, WPARAM, LPARAM
import time
user32 = CDLL("user32.dll")
kernel32 = CDLL("kernel32.dll")

class KBDLLHOOKSTRUCT(Structure):
    _fields_ = [
        ('vkCode', DWORD),
        ('scanCode', DWORD),
        ('flags', DWORD),
        ('time', DWORD),
        ('dwExtraInfo', DWORD)]

def uninstallHookProc(hooked):
    if hooked is None:
        return
    user32.UnhookWindowsHookEx(hooked)
    hooked = None

def hookProc(nCode, wParam, lParam):
    if nCode < 0:
        return user32.CallNextHookEx(hooked, nCode, wParam, lParam)
    else:
        if wParam == 256:
            if 162 == lParam.contents.value:
                print("Ctrl pressed, call uninstallHook()")
                uninstallHookProc(hooked)
                sys.exit(-1)
            x=cast(lParam,POINTER(KBDLLHOOKSTRUCT))
            print(chr(lParam.contents.value))
    return user32.CallNextHookEx(hooked, nCode, wParam, lParam)

def startKeyLog():
    msg = MSG()
    user32.GetMessageA(byref(msg), 0, 0, 0)

def installHookProc(hooked, pointer):
    hooked = user32.SetWindowsHookExA(
        13,
        pointer,
        kernel32.GetModuleHandleW(),
        0
    )
    if not hooked:
        return False
    return True

HOOKPROC = WINFUNCTYPE(c_int, c_int,c_int, POINTER(DWORD))
pointer = HOOKPROC(hookProc)
hooked = None
if installHookProc(hooked, pointer):
    print("Hook installed")
    try:
        msg = MSG()
        user32.GetMessageA(byref(msg), 0, 0, 0)
    except KeyboardInterrupt as kerror:
        uninstallHookProc(hooked)
        print("uninstall Hook")
else:
    print("Hook installed error")

e = kernel32.GetLastError()
print(e)

Всегда возвращать ASCII

в верхнем регистре
...