程序员的知识教程库

网站首页 > 教程分享 正文

《录制/播放 鼠标/键盘事件 一》低级鼠标输入事件

henian88 2024-08-13 06:16:23 教程分享 16 ℃ 0 评论

鼠标低级事件回调函数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);
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表