win32gui钩子函数hook

Hook我们可以通过ctypes中的wintypes监控按键及鼠标情况,

from ctypes import wintypes

调用监控鼠标和键盘的钩子函数

建立好钩子,SetWindowsHookExA

继续钩子,回调函数,CallNextHookEx

卸载钩子,UnhookWindowsHookEx

通过ctypes库调用相关的

再进行相关操作的时候,需要对钩子函数内的一些参数进行定义描述。

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


class POINT(Structure):
    _fields_ = [
        ('x', c_long),
        ('y', c_long)
    ]


class MSLLHOOKSTRUCT(Structure):
    _fields_ = [
        ('pt', POINT),
        ('hwnd', c_int),
        ('wHitTestCode', c_uint),
        ('dwExtraInfo', c_uint),
    ]

上述,就像是一些c定义的结构体

ctypes基础:ctypes基础

关于ctypes的cast、POINTER、cfunction、SetWindowsHookEx、CallNextHookEx、UnhookWindowsHookEx的作用

cast
函数的作用是:将一个ctypes实例转换为一个指向另一个ctypes数据类型的指针。cast()接受两个参数,一个是ctypes对象(可以转换成某种类型的指针),另一个是ctypes指针类型。它返回第二个参数的一个实例,该实例引用与第一个参数相同的内存块:
POINTER:创建指针类型
cfunction:创建一个c函数类型的对象工厂
然后通过调用创建的cfunction来生成对象函数。
SetWindowsHookEx( idHook: Integer; {钩子类型} 
                  lpfn: TFNHookProc; {函数指针} 
                   hmod: HINST; {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInstance; 如果是当前线程这里可以是 0}
                   dwThreadId: DWORD {关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子} ): 
HHOOK; {返回钩子的句柄; 0 表示失败}
//钩子类型 idHook 选项: 
WH_MSGFILTER = -1; {线程级; 截获用户与控件交互的消息} 
WH_JOURNALRECORD = 0; {系统级; 记录所有消息队列从消息队列送出的输入消息, 在消息从队列中清除时发生; 可用于宏记录} WH_JOURNALPLAYBACK = 1; {系统级; 回放由 WH_JOURNALRECORD 记录的消息, 也就是将这些消息重新送入消息队列}
WH_KEYBOARD = 2; {系统级或线程级; 截获键盘消息} 
WH_GETMESSAGE = 3; {系统级或线程级; 截获从消息队列送出的消息} 
WH_CALLWNDPROC = 4; {系统级或线程级; 截获发送到目标窗口的消息, 在 SendMessage 调用时发生} 
WH_CBT = 5; {系统级或线程级; 截获系统基本消息, 譬如: 窗口的创建、激活、关闭、最大最小化、移动等等} 
WH_SYSMSGFILTER = 6; {系统级; 截获系统范围内用户与控件交互的消息} 
WH_MOUSE = 7; {系统级或线程级; 截获鼠标消息} 
WH_HARDWARE = 8; {系统级或线程级; 截获非标准硬件(非鼠标、键盘)的消息} 
WH_DEBUG = 9; {系统级或线程级; 在其他钩子调用前调用, 用于调试钩子}
WH_SHELL = 10; {系统级或线程级; 截获发向外壳应用程序的消息} 
WH_FOREGROUNDIDLE = 11; {系统级或线程级; 在程序前台线程空闲时调用} 
WH_CALLWNDPROCRET = 12; {系统级或线程级; 截获目标窗口处理完毕的消息, 在 SendMessage 调用后发生}

CallNextHookEx方法将钩子信息传递给当前钩子链表中的下一个钩子子程。
钩子子程能够在处理钩子信息之前或者之后调用该方法。
nCode  指定传递给当前钩子子程的钩子子程代码。下一个钩子子程使用这段代码来确定如何处理钩子信息。
wParam:[in]指定传递给当前钩子子程的wParam值。该参数的含义取决于与当前钩子链关联的钩子的类型。
lParam:[in]指定传递给当前钩子子程的lParam值。此参数的含义取决于与当前钩子链关联的钩子的类型。
wParam/ lParam:这两个参数分别指定传递给当前钩子子程的按钮/ lParam值。参数的意义取决于与当前钩子链表相关联的钩子类型。
Return Value值:返回值
该值由链中的下一个钩子子程返回。当前的钩子子程也必须返回这个值。返回值的含义取决于钩子类型。该值由钩子链表中的下一个钩子子程返回。当前钩子子程也必须返回该值。返回值的意义取决于钩子类型。

UnhookWindowsHookEx:卸载钩子
参数hwnd:是钩子的句柄

 

 

 

 

你可能感兴趣的:(Python)