# minigui[基础篇][10]—— 事件钩子

1.什么是事件钩子

1.键盘事件和鼠标事件以其正常的途径从底层设备传递到最终的应用程序窗口过程中进行处理
2.MiniGUI 提供了一种机制,使得我们可以在这些事件转换成相应的消息并传递到具体的窗口之前截获这些事件,然后有两种选择:让事件继续沿着正常的路径传递;或者打断事件的传递
3.这种机制就是钩子机制。钩子其实是一个回调函数,如果应用程序注册有钩子,系统就会在传递消息的中途调用这个回调函数,然后根据该回调函数的返回值来判断是否继续传递消息
4.钩子回调函数是由 MiniGUI 桌面线程调用的,也就是说,钩子回调函数是在桌面线程中执行的,因此,不能在钩子回调函数中向其他线程通过 SendMessage 的方式发送消息,这样会导致可能的死锁发生

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-snkBt8fc-1665112821246)(C:\Users\cjy\AppData\Roaming\Typora\typora-user-images\image-20221007111315977.png)]

2.事件钩子的例程

typedef int (* MSGHOOK)(void* context, HWND dst_wnd, int msg, WPARAM wparam, LPARAM lparam);
@context:注册钩子时传入的一个上下文信息,可以是一个指针
@dst_wnd:该消息的目标主窗口
@msg:消息标识符
@wparam:消息的两个参数
@lparam:消息的两个参数
@retrun: 返回值  返回 HOOK_GOON 将继续传递事件;返回 HOOK_STOP 将停止事件的继续传递
    
MSGHOOK GUIAPI RegisterKeyMsgHook (void* context, MSGHOOK hook);
@context:上下文信息
@hook:钩子函数  注销:传入NULL即可
@return:MSGHOOK 旧的钩子函数
MSGHOOK GUIAPI RegisterMouseMsgHook (void* context, MSGHOOK hook);
int my_hook (void* context, HWND dst_wnd, int msg, WPARAM wParam, LPARAM lparam)
{
    if (...)
        return HOOK_GOON;
    else
        return HOOK_STOP;
}

MSGHOOK old_hook = RegisterKeyMsgHook (my_context, my_hook);
...
/* Restore old hook */
RegisterKeyMsgHook (0, old_hook);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值