鼠标低级事件回调函数LowLevelMouseProc:
LRESULT CALLBACK LowLevelMouseProc(
_In_ int nCode,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
nCode:
钩子过程用于确定如何处理消息的代码。如果nCode小于零,则钩子过程必须将消息传递给CallNextHookEx函数,而无需进一步处理,并且应返回CallNextHookEx返回的值。此参数可以是以下值之一。
值 | 含义 |
HC_ACTION 0 | wParam和lParam参数包含有关鼠标消息的信息。 |
wParam:
鼠标消息的标识符。此参数可以是以下消息之一:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE、WM_MOUSEWHEEL、WM_MUSEWHEEL、WM_RBUTTONDOWN或WM_RBUTTONUP。(M$文档上这么写的,其实应该还有中间键、侧键的DOWN和UP等)
lParam:
指向MSLLHOOKSTRUCT结构的指针。
typedef struct tagMSLLHOOKSTRUCT {
POINT pt;
DWORD mouseData;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCT, *LPMSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;
POINT pt 鼠标的 x 和 y 坐标。
DWORD mouseData; 如果消息 WM_MOUSEWHEEL,则此成员的高序字是滚轮增量。 保留低序字。 正值表示滚轮向前旋转(远离用户);负值表示滚轮向后旋转(朝向用户)。 一键滚轮定义为 WHEEL_DELTA,即 120。
DWORD flags; 事件注入的标志。 应用程序可以使用以下值来测试标志。 测试LLMHF_INJECTED (位 0) 将告知是否已注入事件。 如果是,则测试LLMHF_LOWER_IL_INJECTED (位 1) 将告诉你事件是否是从以较低完整性级别运行的进程注入的。
DWORD time; 此消息的时间戳。
ULONG_PTR dwExtraInfo; 与消息关联的其他信息。
定义个结构KBMSRECORD用于记录数据,附上记录鼠标低级事件代码:
#define RTYPE_KB 1
#define RTYPE_MS 2
pthread_mutex_t kbms_mutex;
KBMSRECORD* kbmsrecord = NULL;
KBMSRECORD* last_kbmsrecord = NULL;
struct KBMSRECORD {
int rtype; //RTYPE_KB,RTYPE_MS
int nCode;
WPARAM wParam;
KBDLLHOOKSTRUCT* kb;
MSLLHOOKSTRUCT* ms;
KBMSRECORD* next;
};
// 鼠标钩子回调函数
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
MSLLHOOKSTRUCT* pMouseHookStruct = reinterpret_cast<MSLLHOOKSTRUCT*>(lParam);
//复制数据
KBMSRECORD* ms_record = new KBMSRECORD();
ms_record->rtype = RTYPE_MS;
ms_record->nCode = nCode;
ms_record->wParam = wParam;
ms_record->ms = new MSLLHOOKSTRUCT();
ms_record->ms->pt.x = pMouseHookStruct->pt.x;
ms_record->ms->pt.y = pMouseHookStruct->pt.y;
ms_record->ms->mouseData = pMouseHookStruct->mouseData;
ms_record->ms->flags = pMouseHookStruct->flags;
ms_record->ms->time = pMouseHookStruct->time;
ms_record->ms->dwExtraInfo = pMouseHookStruct->dwExtraInfo;
ms_record->kb = NULL;
ms_record->next =NULL;
//同步操作队列
pthread_mutex_lock(&kbms_mutex);
if(kbmsrecord==NULL){
kbmsrecord = ms_record;
last_kbmsrecord = ms_record;
}else{
last_kbmsrecord->next = ms_record;
last_kbmsrecord = ms_record;
}
pthread_mutex_unlock(&kbms_mutex);
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
本文暂时没有评论,来添加一个吧(●'◡'●)