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